You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:将Java MD5加密逻辑转换为Python代码以获得一致输出

解决Java与Python MD5+Base64结果不一致的问题

我帮你定位到了问题的核心,主要是JSON序列化的格式差异导致两者处理的原始字符串不一样,最终MD5加密结果自然不同。具体差异点和修正方案如下:

核心差异分析

  1. JSON键的排序逻辑:你的Python代码里用了sort_keys=True,但Java中使用的JSONObject(推测是阿里fastjson的实现)默认按键的插入顺序生成字符串,不会对键进行排序,这直接导致两者生成的JSON字符串结构不同。
  2. JSON格式的空格差异:Python的json.dumps()默认会在键值对之间添加空格(比如"stationId": "xxx"),而Java的JSONObject.toJSONString()默认生成紧凑的无空格格式("stationId":"xxx"),这也会改变原始字符串的内容。
  3. 字符编码的隐式依赖: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:12:35