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

为何设置Argon2 hash_len为32却输出长度43而非32?

问题解答

原因分析

你看到的长度43是Base64编码后的字符串长度,而非原始哈希的字节长度。Argon2默认会将原始的32字节(256位)哈希值用URL-safe的Base64编码输出:

  • 32字节对应256位二进制数据,Base64每6位二进制转换为1个ASCII字符
  • 256 ÷ 6 = 42.666,因此需要43个字符才能完整编码(Argon2实现通常省略填充符号=,最终长度为43)

解决方法

如果需要获取原始的32字节哈希值,只需将Base64编码的字符串解码回二进制格式即可,修改后的代码如下:

from argon2 import PasswordHasher
import base64

password = "abc123"
salt = b'b8b17dbde0a2c67707342c459f6225ed'

hasher = PasswordHasher(
    salt_len=len(salt),
    hash_len=32,
)
hasherOutput = hasher.hash(password, salt=salt)
hash_b64 = hasherOutput.split('$')[-1]

# 补全Base64填充符号后解码
raw_hash = base64.urlsafe_b64decode(hash_b64 + '=' * (-len(hash_b64) % 4))
print(len(raw_hash))  # 输出: 32

补充说明

  • Argon2的标准输出格式($argon2id$v=19$m=102400,t=2,p=8$salt$hash)中,hash部分始终是Base64编码结果,方便存储和传输二进制数据
  • 验证哈希时无需手动解码,PasswordHasher.verify()方法会自动处理编码后的字符串

内容的提问来源于stack exchange,提问作者O'Niel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:07:39