Java中的HMAC SHA1签名

我正在尝试与TransUnion Web服务进行交互,我需要提供HMAC-SHA1签名来访问它。

此示例位于TransUnion文档中:
输入SampleIntegrationOwner2008‐11‐18T19:14:40.293Z ,安全密钥为xBy/2CLudnBJOxOtDhDRnsDYq9HTuDVr2uCs3FMzoxXEA/Od9tOuwSC70+mIfpjeG68ZGm/PrxFf/s/CzwxF4Q==创建/UhwvT/kY9HxiXaOjpIc/BarBkc=

鉴于数据和密钥,我无法在Java中获得相同的结果。 我已经尝试了几个在线计算器,但也没有一个返回这个结果。 他们的文档中的示例是否不正确,或者我只是没有正确处理这些字符串?

这是我目前正在使用的代码:

 public static String calcShaHash (String data, String key) { String HMAC_SHA1_ALGORITHM = "HmacSHA1"; String result = null; try { Key signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM); Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM); mac.init(signingKey); byte[] rawHmac = mac.doFinal(data.getBytes()); result = Base64.encodeBase64String(rawHmac); } catch (Exception e) { e.printStackTrace(); } return result; } 

这是我的unit testing代码:

 @Test public void testCalcShaHash() { String data = "SampleIntegrationOwner2008-11-18T19:14:40.293Z"; String key = "xBy/2CLudnBJOxOtDhDRnsDYq9HTuDVr2uCs3FMzoxXEA/Od9tOuwSC70+mIfpjeG68ZGm/PrxFf/s/CzwxF4Q=="; String result = Utils.calcShaHash(data, key); assertEquals(result, "/UhwvT/kY9HxiXaOjpIc/BarBkc="); } 

我注意到的一件事是连字符不是正常的连字符。 如果复制并粘贴它们,则它们不在ASCII字符集中。 我可以肯定地说,哈希长度看起来是正确的。 有趣的是,即使在输入正确的连字符后,我也无法让你的代码产生正确的答案。但无论如何。 它解决了这个问题。 好哇!

这看起来像Base64编码的密钥。 所以我认为你需要对它进行base64解码,然后将其传递给HMAC。 像这样的东西(仅用于说明我还没有测试过,任何错误都是读者的练习):

 public String getHmacMD5(String privateKey, String input) throws Exception{ String algorithm = "HmacSHA1"; byte[] keyBytes = Base64.decode(privateKey); Key key = new SecretKeySpec(keyBytes, 0, keyBytes.length, algorithm); Mac mac = Mac.getInstance(algorithm); mac.init(key); return Base64.encode(mac.doFinal(input.getBytes())); }