Java 中的 HMAC SHA1 签名

Sha*_*ane 5 java sha hmacsha1

我正在尝试与 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;
}
Run Code Online (Sandbox Code Playgroud)

这是我的单元测试代码:

@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=");

}
Run Code Online (Sandbox Code Playgroud)

Joh*_*tts 2

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