
本文旨在解决在使用 Argon2 密码哈希算法生成 256 位(32 字节)哈希值时,输出长度超出预期的问题。我们将深入探讨 Base64 编码在 Argon2 输出中的作用,并提供正确解码 Base64 编码哈希值的示例代码,确保您能够获得所需的 256 位哈希值。
在使用 Argon2 密码哈希算法时,我们通常期望通过设置 hash_len 参数来控制输出哈希值的长度。然而,在某些情况下,即使我们将 hash_len 设置为 32(对应 256 位),实际输出的字符串长度可能会超过 32。 这通常是因为 Argon2 库默认对哈希值进行 Base64 编码。
Base64 是一种将二进制数据编码为 ASCII 字符串的编码方式。它使用 64 个不同的字符来表示二进制数据,因此编码后的字符串长度通常会比原始二进制数据更长。 具体来说,Base64 编码将每 3 个字节(24 位)的数据编码为 4 个字符。 由于 32 不是 3 的倍数,Base64 编码后的长度会是 4 的倍数且大于 32,因此会增加到 43(包含末尾的填充字符)。
为了获得原始的 256 位(32 字节)哈希值,我们需要对 Argon2 输出的 Base64 编码字符串进行解码。 可以使用 binascii.a2b_base64() 函数来实现。
以下是修改后的代码示例:
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_encoded = hasherOutput.split('$')[-1]
# 确保字符串长度是 4 的倍数,如果不是,则添加 padding
padding_needed = len(hash_encoded) % 4
if padding_needed:
hash_encoded += '=' * (4 - padding_needed)
hash_decoded = binascii.a2b_base64(hash_encoded)
print(len(hash_decoded))
print(hash_decoded)
# Output: 32
# Output: b'\x83\xe0\x04\xb7\x9f\xc0\x1a\x0e\x01\x99\x01\x83\x9e\x1c\x96\xb6\x87\xba\x8b\x89\xde\xd3\x05\x0e\xd0\x83\x9b\x91\xe3\x8e\x08\x99'代码解释:
注意事项:
总结:
通过对 Argon2 输出的 Base64 编码字符串进行解码,我们可以获得原始的 256 位(32 字节)哈希值。 了解 Base64 编码在 Argon2 输出中的作用对于正确使用 Argon2 密码哈希算法至关重要。 通过本文提供的代码示例和注意事项,您可以轻松地生成和处理所需的 256 位哈希值。
以上就是使用 Argon2 生成 256 位哈希值的正确方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号