如何在Python中复现JavaScript CryptoJS的HMAC_SHA256运算
问题解答
1. CryptoJS.enc.Hex.parse函数的作用
该函数的作用是将十六进制编码的字符串直接解码为对应的原始二进制字节序列,不会把输入的十六进制字符串当成普通文本做UTF-8编码处理。
比如输入hex字符串"a1",parse后得到的是单字节\xa1,而非"a1"两个字符UTF-8编码后的b'a1'(即\x61\x31)。你提供的JS代码中seed为64位十六进制字符串,parse后得到32字节的原始二进制数据,作为HMAC运算的消息输入。
另外你编写的Python代码存在额外错误:CryptoJS.HmacSHA256的参数顺序为HmacSHA256(消息, 密钥),而Python标准库hmac.new的参数顺序为hmac.new(密钥, 消息, 哈希算法),你之前的代码不仅没对seed做hex转二进制处理,还把密钥和消息的顺序搞反了,这也是结果不一致的核心原因。
2. Python等价实现逻辑
使用Python内置的bytes.fromhex()方法即可实现和CryptoJS.enc.Hex.parse完全等价的转换,修正参数顺序后的完整可运行代码如下:
import hmac import hashlib seed = "319aa8124bbcddac2bae8438cfd5e658aeca56d524736739622dfb0a09942b22" salt = "0000000000000000004d6ec16dafe9d8370958664c1dc422f452892264c59526" # 等价CryptoJS.enc.Hex.parse(seed):将hex字符串转为原始二进制字节 seed_raw = bytes.fromhex(seed) # 按正确参数调用HMAC-SHA256 hmac_obj = hmac.new(key=salt.encode("utf-8"), msg=seed_raw, digestmod=hashlib.sha256) result = hmac_obj.hexdigest() print(result) # 输出:fe6a57f08b9970b7cd497e627afac956203a8ef829d2d97c7967775c1c0b6f6a,与JS端输出完全一致
内容的提问来源于stack exchange,提问作者user3556757
相关产品推荐
相关产品推荐

