Rust中hmacsha与hmac-sha1计算HMAC-SHA1结果不一致问题
问题根源
你调用hmac-sha1时存在两个直接导致结果偏差的错误:
- 参数顺序传反:
hmac-sha1库的hmac_sha1函数第一个入参是HMAC密钥,第二个入参是待计算的消息内容;而你参考的hmacsha调用逻辑里,HmacSha::from第一个入参是待计算消息、第二个入参是密钥,你直接照搬了传参顺序,把消息和密钥的位置搞反了。 - 密钥编码不匹配:你在
hmacsha版本中传入的密钥是字符串"C2B3723CC6AED9B5343C53EE2F4367CE",库实际使用的是该字符串的UTF-8编码字节(共32字节);但你给hmac-sha1定义的密钥是将上述十六进制字符串按双字符解码得到的原始字节数组(共16字节),两个密钥值完全不同,计算结果自然无法匹配。
修正方案
首先对齐两个库的入参内容:
- 密钥统一使用字符串
"C2B3723CC6AED9B5343C53EE2F4367CE"的UTF-8字节,不要做十六进制解码 - 待计算的消息统一使用
encode_hex(&key)生成的十六进制字符串对应的UTF-8字节 - 严格按照
hmac_sha1的参数顺序传参:先传密钥,再传消息
修正后的代码如下:
const ENCRYPT_KEY_STR: &str = "C2B3723CC6AED9B5343C53EE2F4367CE"; let key = [200, 7, 216, 173, 213, 146, 229, 69, 96, 121, 68, 66, 55, 215, 179, 150, 34, 206, 128, 136, 252, 37, 173, 113, 170, 80, 148, 36, 5, 129, 212, 183, 47, 24, 47, 123, 157, 47, 26, 2]; let message = encode_hex(&key); let hash_key = hmac_sha1(ENCRYPT_KEY_STR.as_bytes(), message.as_bytes()); println!("{:?}", encode_hex(&hash_key));
运行后输出结果为545E5C8D754F21DD586BA7378F8AA7AA815F4500,和在线工具、hmacsha库的计算结果完全一致。
内容的提问来源于stack exchange,提问作者Sergio Ivanuzzo
相关产品推荐
相关产品推荐

