0

0

使用 Argon2 生成 256 位哈希值

花韻仙語

花韻仙語

发布时间:2025-10-08 12:27:00

|

362人浏览过

|

来源于php中文网

原创

使用 argon2 生成 256 位哈希值

本文介绍了如何使用 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()}")

代码解释:

博思AIPPT
博思AIPPT

博思AIPPT来了,海量PPT模板任选,零基础也能快速用AI制作PPT。

下载
  1. 导入必要的库: 导入 argon2 用于哈希计算,binascii 用于 Base64 解码。
  2. 设置密码和盐: 定义要哈希的密码和盐值。盐值应该足够随机且唯一。
  3. 创建 PasswordHasher 对象: 实例化 PasswordHasher 对象,设置 salt_len 和 hash_len 参数。
  4. 进行哈希: 调用 hash() 方法对密码进行哈希,得到哈希结果。
  5. 提取哈希字符串: 从哈希结果中提取 Base64 编码后的哈希字符串。hasherOutput 是一个包含 Argon2 算法标识、版本、参数和哈希值的字符串,通过 split('$')[-1] 可以提取出哈希值部分。
  6. 解码 Base64: 使用 binascii.a2b_base64() 函数对 Base64 编码的哈希字符串进行解码,得到原始的 32 字节哈希值。
  7. 处理 Base64 Padding: Base64 编码要求输入长度是 3 的倍数。如果编码后的字符串长度不是 4 的倍数,需要添加 = 字符进行 padding。 代码中添加了 try...except 块来处理这种情况。
  8. 打印结果: 打印 Base64 编码后的哈希值长度和内容,以及解码后的哈希值长度和内容(以十六进制格式显示)。

注意事项:

  • 盐值(salt)必须是随机的、唯一的,并且长度应该足够长,以防止彩虹表攻击。
  • hash_len 参数应该根据实际需求进行设置。如果需要更高的安全性,可以增加 hash_len 的值。
  • 在存储哈希值时,应该同时存储盐值,以便在验证密码时使用相同的盐值进行哈希。
  • Base64 解码时,如果遇到 Incorrect padding 错误,通常是因为 Base64 字符串的长度不是 4 的倍数,需要添加适当的 padding。

总结:

在使用 argon2 库生成指定长度的哈希值时,需要注意 Base64 编码的影响。如果需要获得原始的字节哈希值,需要对 Base64 编码后的字符串进行解码。通过使用 binascii.a2b_base64() 函数,可以方便地将 Base64 编码的哈希值解码为原始的字节数据。 此外,注意处理 Base64 编码可能需要的 padding,确保解码过程正确无误。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

745

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

634

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

757

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1259

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

705

2023.08.11

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

78

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号