为何设置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
相关产品推荐
相关产品推荐

