【问题标题】:HMAC SHA1 Signature in JavaJava中的HMAC SHA1签名
【发布时间】: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 字符。通过放入普通破折号,结果是正确的,无需解码密钥。请添加您的评论作为答案。

标签: java sha hmacsha1


【解决方案1】:

这看起来像一个 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()));
}

【讨论】:

  • 我试过了,但仍然没有得到正确的答案。请参阅上面的代码示例。
  • @chubb 是否可以使用用于加密的密钥来解密该值?
  • No HMAC 是一种单向散列,它使用公钥/私钥对来验证散列是使用该特定密钥生成的。在正常的单向散列函数(SHA1、MD5、SHA256 等)中,不涉及密钥,因此任何知道该算法的人都可以创建散列。 HMAC 允许您确保只有持有特定密钥的人/系统才能生成此哈希,而没有其他人。
【解决方案2】:

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

【讨论】:

  • @Shane 你能从这里的原始问题复制更新后的 SSCE 吗?我复制了您的原始代码,并使用适当的连字符对其进行了更新,但对我来说仍然失败。我认为还有一个我们尚未发现的差异,我想为后代保留。
猜你喜欢
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2011-10-26
相关资源
最近更新 更多