【问题标题】:OpenSSL Hmac and BouncyCastle Hmac DifferOpenSSL Hmac 和 BouncyCastle Hmac 不同
【发布时间】:2014-08-23 20:31:19
【问题描述】:

我试图弄清楚为什么 openssl 中的 hmac 没有给我与 java 中的 hmac 相同的结果。

在打开的 ssl 中

echo -n "Hello" | openssl dgst -sha256 -hmac 04d6b077d60e323711b37813b3a68a71

输出: cc598d8840fe409d5fcc1c1c856f9e8c311d1c458850615555857b023f1cd94c

在java中

String key = "04d6b077d60e323711b37813b3a68a71"
SecretKeySpec key2 = new SecretKeySpec(Hex.decode(key), "RAW");
String data = "Hello";
Mac hmac = Mac.getInstance("Hmac-SHA256", BouncyCastleProvider.PROVIDER_NAME);
hmac.init(key2)
byte[] bytes = hmac.doFinal(data.getBytes());
System.out.println(Hex.toHexString(bytes));

输出: 877f9c8eb44c20987e3978928fbfcea0f1cf99c88f9db904596921b7ecf0613b

我不知道为什么这些不同。

【问题讨论】:

  • FWIW 我使用 Python 代码 hmac.new('04d6b077d60e323711b37813b3a68a71', 'Hello', hashlib.sha256).hexdigest() 获得了 cc59... 值(与 OpenSSL 相同),所以我怀疑您的 Java 代码在某种程度上是错误的。
  • 你的key是32个字符,Java中十六进制解码后的16个字节。我相信密钥对于 SHA256 HMAC 来说太小了。你可以试试 Java 中的key.getBytes()
  • Oleg 成功了——我的 Python 测试也将密钥视为一系列 ASCII 字符。使用'\x04\xd6...' 而不是04d6... 给出了Java 给出的877f... 结果。

标签: java openssl bouncycastle hmac sha256


【解决方案1】:

OpenSSL 将 -hmac key 选项视为密钥只是一个表示为相应 ASCII 字符的字节数组。因此,密钥仅限于包含可打印字符。

使用 Java 可以获得与 OpenSSL 相同的结果

SecretKeySpec key2 = new SecretKeySpec( key.getBytes("ASCII"), "RAW" );

您也可以使用openssl dgst -sha256 -mac HMAC -macopt hexkey:string,其中string 将被视为十六进制编码的密钥。

【讨论】:

  • 我最终发现 -hmac 键只是将键视为字符串,并获取其中的字节。我使用的 openssl (0.9.8e) 版本似乎无法将 openssl dgst -sha256 -mac HMAC -maopt 识别为命令
猜你喜欢
  • 2015-09-07
  • 1970-01-01
  • 2016-02-07
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2012-11-13
相关资源
最近更新 更多