技术求助:将Java MD5加密逻辑转换为Python代码以获得一致输出
解决Java与Python MD5+Base64结果不一致的问题
我帮你定位到了问题的核心,主要是JSON序列化的格式差异导致两者处理的原始字符串不一样,最终MD5加密结果自然不同。具体差异点和修正方案如下:
核心差异分析
- JSON键的排序逻辑:你的Python代码里用了
sort_keys=True,但Java中使用的JSONObject(推测是阿里fastjson的实现)默认按键的插入顺序生成字符串,不会对键进行排序,这直接导致两者生成的JSON字符串结构不同。 - JSON格式的空格差异:Python的
json.dumps()默认会在键值对之间添加空格(比如"stationId": "xxx"),而Java的JSONObject.toJSONString()默认生成紧凑的无空格格式("stationId":"xxx"),这也会改变原始字符串的内容。 - 字符编码的隐式依赖:Java中
body.getBytes()如果不指定编码,会依赖系统默认编码,建议显式指定UTF-8避免环境差异;Python中encode()默认是UTF-8,这点没问题,但显式写出更清晰。
修正后的Python代码
import json import base64 import hashlib body_content = {"stationId": "1298491919448667556"} # 1. 不排序键,2. 生成紧凑无空格的JSON字符串,3. 显式指定UTF-8编码 body = json.dumps(body_content, sort_keys=False, separators=(',', ':')).encode('utf-8') hash_obj = hashlib.md5() hash_obj.update(body) content_md5 = base64.b64encode(hash_obj.digest()).decode('utf-8') print("content-md5:", content_md5)
验证结果
运行修正后的Python代码,输出结果会和Java代码完全一致:5pxCd9dmyPR/V2jerFJdXQ==
另外,为了保证Java端的稳定性,建议也在Java代码中显式指定UTF-8编码,避免系统编码差异:
md.update(body.getBytes("UTF-8"));
内容的提问来源于stack exchange,提问作者Gagan Naidu
相关产品推荐
相关产品推荐

