Go实现加盐SHA512哈希与Java生成结果不一致如何解决
Go SHA512哈希与Java实现结果不一致的问题排查与修复
核心问题点
- 加盐顺序错误
Java侧计算哈希时,先写入盐的字节再写入消息的字节,最终哈希输入为salt + message的字节序列;你的Go代码将消息字节放在前、盐字节放在后,哈希输入为message + salt,输入内容完全不同,导致哈希结果不一致。 - 十六进制补零逻辑错误
Java代码中给字节值加0x100(十进制256)的作用是生成3位十六进制字符串后截断第一位,实现不足两位的十六进制值自动补前导零。你的Go代码中将0x100强转为byte类型,byte为8位无符号整数,0x100会溢出为0,补零逻辑完全失效,也会导致最终生成的哈希字符串长度不足(标准SHA512哈希转十六进制应为128位,你的Go输出只有64位就是该问题导致)。 - (可选)字符编码对齐建议
Java的String.getBytes()默认使用运行平台的默认编码,Go的[]byte(string)默认使用UTF-8编码,建议两边都明确指定使用UTF-8编码,避免不同环境下编码差异导致的结果偏差。
修正后的Go代码
import ( "crypto/sha512" "fmt" ) func HashSha512(original string) (string, error) { salt := "abcde687869" sha512Hasher := sha512.New() // 先写入盐,再写入消息,和Java逻辑完全对齐 sha512Hasher.Write([]byte(salt)) sha512Hasher.Write([]byte(original)) hashedBytes := sha512Hasher.Sum(nil) s := "" // 补零逻辑和Java对齐 for i := 0; i < len(hashedBytes); i++ { s += fmt.Sprintf("%x", (int(hashedBytes[i]&0xff) + 0x100))[1:] } return s, nil }
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

