请求协助将Java SHA-256哈希代码转Python以匹配正确输出
解决Java转Python SHA-256哈希不一致问题
我帮你找出了两个关键问题,修正后就能得到和Java一致的哈希结果了:
问题分析
你的Python代码和Java代码有两处核心差异:
- 编码处理缺失:Java明确使用
StandardCharsets.UTF_8将字符串转为字节数组,而你的Python代码直接传入字符串(Python3中hashlib.sha256需要字节对象,若隐式转换可能用了系统默认编码,和UTF-8不一致)。 - 哈希截取长度错误: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
相关产品推荐
相关产品推荐

