
本文介绍了如何使用 Python 的 argon2 库生成 256 位的哈希值。通过示例代码展示了设置 hash_len 参数为 32 字节(256 位)后,实际输出长度为 43 的原因,并提供了解决方案,即解码 Base64 编码后的哈希值。
在使用 Argon2 进行密码哈希时,我们通常需要指定输出哈希值的长度。argon2 库中的 PasswordHasher 类提供了一个 hash_len 参数,用于设置哈希值的字节长度。期望生成 256 位的哈希值时,通常会将 hash_len 设置为 32,因为 32 字节等于 256 位。
然而,在实际操作中,可能会遇到一个问题:即使将 hash_len 设置为 32,最终得到的哈希值字符串的长度却不是 32,而是更长,例如 43。这是因为 argon2 库默认会将生成的二进制哈希值进行 Base64 编码,以便于存储和传输。Base64 编码会将每 3 个字节的数据编码成 4 个字节,因此编码后的字符串长度会比原始字节长度更长。
以下是一个示例代码:
from argon2 import PasswordHasher
import binascii
password = "abc123"
salt = b'b8b17dbde0a2c67707342c459f6225ed'
hasher = PasswordHasher(
salt_len=len(salt),
hash_len=32,
)
hasherOutput = hasher.hash(password, salt = salt)
hash_string = hasherOutput.split('$')[-1]
print(f"Encoded Hash Length: {len(hash_string)}")
print(f"Encoded Hash: {hash_string}")
# 解码 Base64 编码后的哈希值
try:
decoded_hash = binascii.a2b_base64(hash_string)
except binascii.Error:
# Base64 字符串长度不是 4 的倍数,需要添加 padding
missing_padding = len(hash_string) % 4
if missing_padding:
hash_string += '=' * (4 - missing_padding)
decoded_hash = binascii.a2b_base64(hash_string)
print(f"Decoded Hash Length: {len(decoded_hash)}")
print(f"Decoded Hash: {decoded_hash.hex()}")代码解释:
注意事项:
总结:
在使用 argon2 库生成指定长度的哈希值时,需要注意 Base64 编码的影响。如果需要获得原始的字节哈希值,需要对 Base64 编码后的字符串进行解码。通过使用 binascii.a2b_base64() 函数,可以方便地将 Base64 编码的哈希值解码为原始的字节数据。 此外,注意处理 Base64 编码可能需要的 padding,确保解码过程正确无误。
以上就是使用 Argon2 生成 256 位哈希值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号