OpenSSL Hmac和BouncyCastle Hmac不同

时间:2014-07-02 21:39:59

标签: java openssl bouncycastle hmac sha256

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

在open 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

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

1 个答案:

答案 0 :(得分:4)

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

使用

,您可以在Java中获得与OpenSSL相同的结果
SecretKeySpec key2 = new SecretKeySpec( key.getBytes("ASCII"), "RAW" );

或者,您可以使用openssl dgst -sha256 -mac HMAC -macopt hexkey:stringstring视为HEX编码密钥。