JavaScript与Python HMAC-SHA256哈希Base64编码结果不一致问题
差异原因
两端编码结果不一致的核心问题是哈希结果的取值方式错误:
- JavaScript端
CryptoJS.HmacSHA256返回的是原始二进制格式的哈希结果(WordArray类型),传入Base64编码的是原始哈希字节,32字节的SHA256结果编码后去掉填充等号长度为43字符,和给出的JS输出长度匹配。 - Python端调用了
.hexdigest()获取哈希结果,该方法返回的是哈希值转成的十六进制可读字符串——32字节的原始哈希会被转成64个字符长度的十六进制文本,后续Base64编码实际处理的是这串十六进制文本的字节内容,不是原始哈希字节,最终输出长度自然远大于JS端结果,和给出的Python输出长度完全吻合。
修复方法
将Python端获取哈希值的.hexdigest()替换为.digest(),直接拿到原始二进制哈希字节再做编码即可。base64.urlsafe_b64encode本身已经实现了+转-、/转_的URL安全替换,只需要最后去掉末尾填充的=即可和JS端逻辑完全对齐。
修正后的Python代码如下:
import hmac import hashlib import base64 # 提前确认secret.encode()、tokenHB的字节内容和JS端待哈希内容完全一致 signature_hash = hmac.new(secret.encode(), tokenHB, hashlib.sha256).digest() signature = base64.urlsafe_b64encode(signature_hash).rstrip(b'=').decode() print(signature)
校验参考:32字节原始SHA256哈希经URL安全Base64编码、去掉末尾填充后固定为43字符长度,和JS端输出长度一致。
内容的提问来源于stack exchange,提问作者marcus
相关产品推荐
相关产品推荐

