【发布时间】:2012-06-02 03:17:53
【问题描述】:
我正在尝试与 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;
}
这是我的单元测试代码:
@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 字符集中。我只能说哈希长度看起来是正确的。
-
@John Watts - 您对破折号的评论是正确的。我从 Word 文档中复制并粘贴了文本。破折号不是标准的 ASCII 字符。通过放入普通破折号,结果是正确的,无需解码密钥。请添加您的评论作为答案。