如何用Haskell Crypton生成与OpenSSL一致的HMAC?
问题解决:crypton生成的HMAC与openssl输出不一致
核心原因
echo命令默认会在输出末尾追加换行符(\n),这导致openssl实际处理的输入是"TheMessage\n",而你的Haskell代码里传入的是不含换行的"TheMessage",两者输入数据不一致,最终HMAC结果自然不同。
验证与修正方案
1. 调整openssl命令匹配Haskell代码结果
使用echo -n参数禁止添加换行符,此时openssl的输出会和你当前Haskell代码的结果一致:
$ echo -n "TheMessage" | openssl dgst -sha256 -mac HMAC -macopt key:"TheKey" SHA2-256(stdin)= 39c17c48adbc2ea4d469af9ecb2569f921053843af2a0a7716b7a180b0cedff6
2. 修改Haskell代码匹配openssl默认行为
如果要让crypton的结果和原openssl命令输出一致,只需给输入字符串加上换行符:
ghci> hmacGetDigest ( hmac ("TheKey" :: ByteString) ("TheMessage\n" :: ByteString) :: HMAC SHA256 ) 7b2e5669f4a5fa30a3fa0e9147f8975883cddff77725c99a6db07395b9665974
总结
HMAC是基于输入数据的哈希运算,只要两端输入的字节流完全一致,就能得到相同的结果。注意echo的默认换行行为,是这类跨工具结果不一致的常见诱因。
内容的提问来源于stack exchange,提问作者Sergiu Starciuc
相关产品推荐
相关产品推荐

