Argon2-cffi 密码哈希库:Python 安全密码存储指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 argon2-cffi

argon2-cffi 库是 Argon2 密码哈希算法的官方 Python 封装,通过 CFFI(C 外部函数接口)实现。Argon2 是一种现代密码哈希算法,在 2015 年密码哈希竞赛中获胜,此后一直被视为安全存储密码的黄金标准。

argon2-cffi 的主要优势在于,它通过 C 语言实现提供了高性能,同时提供了便捷的 Python 接口。该库由社区积极维护,并根据最新的安全标准定期更新。

安装与配置

标准安装

pip install argon2-cffi

安装附加依赖

pip install argon2-cffi[dev]  # 用于开发
pip install argon2-cffi[tests]  # 用于测试

验证安装

import argon2
print(argon2.__version__)

Argon2 算法变体

Argon2i(数据无关型)

Argon2i 针对侧信道攻击进行了优化。它访问内存的方式与密码内容无关,因此能够抵御基于执行时间的攻击。推荐用于需要防范时间分析攻击的场景。

Argon2d(数据依赖型)

Argon2d 提供对 GPU 攻击和专用硬件攻击的最大防护。它使用数据相关的内存访问方式,增加了攻击并行化的难度。但它在侧信道攻击方面的防护较弱。

Argon2id(混合型)

Argon2id 是一种混合模式,结合了两种变体的优点。它是 argon2-cffi 的默认选项,推荐用于大多数应用场景。前几轮按 Argon2i 执行,后续轮次按 Argon2d 执行。

快速上手

基本用法

from argon2 import PasswordHasher

# 创建哈希器实例
ph = PasswordHasher()

# 哈希密码
password = "我的超级秘密密码"
hash_result = ph.hash(password)
print(f"哈希值: {hash_result}")

# 验证密码
try:
    ph.verify(hash_result, password)
    print("密码正确!")
except Exception as e:
    print(f"密码错误: {e}")

处理不同数据类型

from argon2 import PasswordHasher

ph = PasswordHasher()

# 哈希字符串
string_hash = ph.hash("字符串密码")

# 哈希字节串
bytes_password = b"bytes_password"
bytes_hash = ph.hash(bytes_password)

# 验证
ph.verify(string_hash, "字符串密码")
ph.verify(bytes_hash, bytes_password)

PasswordHasher 配置

构造函数参数

from argon2 import PasswordHasher, Type

ph = PasswordHasher(
    time_cost=3,        # 迭代次数(默认 2)
    memory_cost=65536,  # 内存大小,单位 KB(默认 51200)
    parallelism=2,      # 并行线程数(默认 1)
    hash_len=32,        # 哈希长度,单位字节(默认 32)
    salt_len=16,        # 盐值长度,单位字节(默认 16)
    encoding="utf-8",   # 编码方式(默认 "utf-8")
    type=Type.ID        # Argon2 类型(默认 Type.ID)
)

参数对安全性的影响

time_cost 线性增加执行时间。每增加 1,哈希时间翻倍。

memory_cost 以千字节为单位指定内存用量。较大的值会增加专用硬件攻击的难度。

推荐