JS转Python的MD5哈希+Base64编码结果不一致问题及解决
Python与JS的MD5+Base64结果不一致的原因及修复方法
问题背景
原JavaScript代码:
var requestContent = CryptoJS.MD5('{ "agentSessionId": "1622024176" }'); var requestContentBase64String = requestContent.toString(CryptoJS.enc.Base64);
执行后返回结果:bwtSmXFDxoG4cb0HDrZbhQ==
自行编写的Python代码(注:原代码存在语法错误,已修正语法但保留原逻辑):
import hashlib import base64 request_content = hashlib.md5('{ "agentSessionId": "1622024176" }'.encode('utf-8')).hexdigest() request_content_base64_string = base64.b64encode(request_content.encode())
执行后返回结果:NmYwYjUyOTk3MTQzYzY4MWI4NzFiZDA3MGViNjViODU=,与JS结果不符。
原因分析
- CryptoJS的
MD5()方法返回的是原始二进制哈希值,调用toString(CryptoJS.enc.Base64)是直接对二进制哈希值做Base64编码。 - 你的Python代码中,
hexdigest()会把MD5的二进制结果转换成十六进制字符串(将二进制字节转为对应的16进制字符),之后再对这个字符串做Base64编码,相当于多了一层字符串转换,最终结果自然和JS不一致。
修复后的Python代码
直接获取MD5的原始二进制摘要(用digest()代替hexdigest()),再对二进制数据做Base64编码:
import hashlib import base64 # 1. 将输入字符串转为UTF-8字节流(与JS默认编码对齐) raw_data = '{ "agentSessionId": "1622024176" }'.encode('utf-8') # 2. 计算MD5的原始二进制摘要 md5_digest = hashlib.md5(raw_data).digest() # 3. 对二进制摘要做Base64编码,再转成可读字符串 request_content_base64_string = base64.b64encode(md5_digest).decode('utf-8') print(request_content_base64_string) # 输出:bwtSmXFDxoG4cb0HDrZbhQ==
验证说明
修复后的代码逻辑与JS完全对齐:先将字符串转UTF-8字节流,再计算MD5原始二进制哈希值,最后直接对二进制哈希值做Base64编码,最终得到与JS一致的结果。
内容的提问来源于stack exchange,提问作者Linh Nguyen
相关产品推荐
相关产品推荐

