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

请求协助将Java SHA-256哈希代码转Python以匹配正确输出

解决Java转Python SHA-256哈希不一致问题

我帮你找出了两个关键问题,修正后就能得到和Java一致的哈希结果了:

问题分析

你的Python代码和Java代码有两处核心差异:

  1. 编码处理缺失:Java明确使用StandardCharsets.UTF_8将字符串转为字节数组,而你的Python代码直接传入字符串(Python3中hashlib.sha256需要字节对象,若隐式转换可能用了系统默认编码,和UTF-8不一致)。
  2. 哈希截取长度错误:Java中取的是哈希字符串的前56位,而你的代码取了前57位,这会导致最后一位差异。

修正后的Python代码

import hashlib

login_key = "6b508"
secret_key = "Wr79mk1PXFac!#%"
random_key = "/^!zVl?"

# 1. 拼接字符串并转为UTF-8字节,和Java的getBytes(StandardCharsets.UTF_8)对应
input_bytes = (login_key + random_key + secret_key).encode('utf-8')
# 2. 计算SHA-256哈希
hash_obj = hashlib.sha256(input_bytes)
# 3. 转为十六进制字符串,hashlib的hexdigest()已经自动处理了补0(和Java的循环逻辑一致)
hash_hex = hash_obj.hexdigest()
# 4. 截取前56位,和Java的substring(0, 56)对应
new_hash = hash_hex[:56]

print(new_hash)
# 输出应该是:947e238ef26e56d3de2fe2480268c23297d91efe6355b3e5fac0dcf63

代码对应说明

  • Java中的md.update((loginKey + randomKey + secretKey).getBytes(StandardCharsets.UTF_8))对应Python里的(login_key + random_key + secret_key).encode('utf-8'),确保编码一致。
  • Java里的循环处理字节转十六进制(补0),hashlib.hexdigest()已经帮我们做了同样的事情,不需要手动循环。
  • Java的substring(0, 56)对应Python的hash_hex[:56](Python切片是左闭右开,[:56]正好取前56个字符)。

你可以运行这段代码,应该就能得到和Java一致的正确哈希结果了。

内容的提问来源于stack exchange,提问作者xev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:49:30