Argon2参考实现与Go语言实现哈希输出不一致问题
Argon2命令行与Go x/crypt/argon2库哈希结果不一致问题排查
问题描述
用命令行Argon2参考实现(默认参数)对密码"foobar"和盐"saltsalt"计算哈希,得到了对应的Encoded及Hash结果。但用相同参数通过Go语言x/crypt/argon2库计算时,哈希的HEX和Base64输出都和参考实现不一样。按PHC字符串格式规范,预期Base64输出应该和命令行Encoded字段的最后部分一致,而且两者都是Argon2i版本19,疑惑是不是有编码错误或者参数遗漏。
排查与解决要点
- 严格匹配默认参数:命令行Argon2参考实现的默认参数为:Argon2i算法、迭代次数3、内存65536KB(64MB)、并行度4、哈希长度32字节。Go代码必须完全对齐这些参数,示例代码如下:
import "golang.org/x/crypto/argon2" password := []byte("foobar") salt := []byte("saltsalt") timeCost := 3 memoryCost := 65536 parallelism := 4 keyLength := 32 hash := argon2.Key(password, salt, uint32(timeCost), uint32(memoryCost), uint8(parallelism), uint32(keyLength)) - 处理Base64编码差异:命令行输出的PHC字符串末尾哈希值采用无填充的标准Base64编码,而Go标准库
base64.StdEncoding.EncodeToString会自动添加填充符=,需要手动去除:import ( "encoding/base64" "strings" ) b64Hash := base64.StdEncoding.EncodeToString(hash) // 移除末尾的填充字符 b64Hash = strings.TrimRight(b64Hash, "=") - 确认版本一致性:x/crypt/argon2库默认使用Argon2版本19(对应v1.3),与命令行参考实现版本一致,无需额外配置。
- 验证字节编码:确保密码和盐的字节编码为UTF-8,命令行默认采用UTF-8,Go中直接将字符串转为
[]byte即可符合要求,若涉及特殊字符需额外校验编码一致性。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

