HMAC在Java和C ++中的摘要不同

时间:2012-09-27 19:11:42

标签: java c++ cryptography hmac hmacsha1

我正在尝试集成2个系统,一个使用C ++,另一个使用Jva进行HMAC摘要生成。

以下是C ++代码: -

static const GUID seedGUID = { 0xd6fecf42, 0x2d1e, 0x4db9, { 0xa2, 0x73, 0xeb,
0x34, 0x13, 0xe, 0xa1, 0x37 } };
shaCheckSum.AddData((char*)&seedGUID, sizeof(seedGUID));
shaCheckSum.AddData((char*)szSeed, uiSeedLen);
shaCheckSum.AddData((char*)szStr, uiStrLen);
shaCheckSum.FinalDigest(szResult);

生成的HMAC是9B2D06D314018A5134EA1CF54D5A9F20CECC473965BD9801AAC9D4868EF39D38

szSeed是0.4726005982213448 szStr是test@test.com

以下是Java代码: -

    final String HMAC_SHA1_ALGORITHM = "HmacSha256";
    final String secret = "D6FECF42-2D1E-4db9-A273-EB34130EA137";
    final SecretKeySpec signingKey = new SecretKeySpec(secret.toLowerCase().getBytes(),HMAC_SHA1_ALGORITHM);
    final Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
    mac.init(signingKey);
    mac.update("0.4726005982213448".getBytes());
    mac.update("test@test.com".getBytes());
    final byte[] rawHmac = mac.doFinal();
    for (final byte element : rawHmac)
    {
       result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
    }
    System.out.println( result);

结果HMAC是f91b07623fea970b5f9d1f5d83f850b3a6077c0e80f42b574a01d861143eac09

HMAC都不同。

如何解决这个问题?

感谢您的期待!

2 个答案:

答案 0 :(得分:3)

在C ++版本中,您传递的是seedGUID的字节,而在Java版本中,您正在传递guid的字符串表示形式的二进制编码。您应该在Java版本中创建一个字节数组:

byte[] signingKey = new byte[]{ 0xd6, 0xfe, 0xcf, 0x42, 0x2d, 0x1e, 0x4d, 0xb9, 0xa2, 0x73, 0xeb, 0x34, 0x13, 0xe, 0xa1, 0x37 };
mac.init(signingKey);

您还必须确保对加密的字符串使用相同的编码。您的C ++版本可能使用ASCII字符,因此您必须指定数据的字符集:

mac.update("0.4726005982213448".getBytes("US-ASCII"));
mac.update("test@test.com".getBytes("US-ASCII"));

答案 1 :(得分:1)

除了Lee写的内容之外,我认为您在C ++版本中根本不使用HMAC。在我看来你使用SHA-?直接安全消息摘要(如FinalDigest()方法调用所示)。 SHA-256是HMAC计算的部分,但只执行SHA-256肯定不会产生相同的结果。