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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:30:18