Python3 正在移除 crypt.crypt,且不提供任何替代方案 ¯\_(ツ)_/¯

Python3 正在移除 crypt.crypt,且不提供任何替代方案 ¯\_(ツ)_/¯

💡 原文英文,约800词,阅读约需3分钟。
📝

内容提要

Python 3.13将移除crypt模块且无替代方案,作者为此发布纯Python模块shacrypt512.py,实现SHAcrypt SHA-512算法,可生成和校验$6$格式的shadow密码条目,支持自定义盐和轮数,并附测试用例。

🔎

延伸解读

移除背景与影响范围

Python 3.13 将移除标准库中的 crypt 模块,PEP 594 给出的理由主要针对新代码不应使用该模块,但并未提供替代方案。这意味着现有依赖 crypt.crypt 生成或校验 $6$ SHAcrypt SHA-512 密码哈希的代码将无法直接运行,需要自行迁移或寻找第三方实现。

shacrypt512.py 的功能与用法

作者发布的纯 Python 模块 shacrypt512.py 实现了 SHAcrypt SHA-512 算法,可生成和校验 $6$ 格式的 shadow 密码条目。它支持自定义盐和轮数,默认轮数为 5000,并提供 shacrypt 和 password_ok 两个主要函数,分别用于生成哈希和验证密码,附带的测试用例可帮助确认实现正确性。

迁移时的注意事项

该模块仅支持 $6$ 前缀的 SHAcrypt SHA-512 哈希,不兼容其他 crypt 方法。迁移时需将 crypt.crypt 调用替换为 shacrypt512.shacrypt 或 password_ok,并注意盐值长度限制为 16 字节、轮数会被限制在 1000 到 999999999 之间。对于依赖其他哈希格式的现有代码,仍需另行处理。

❓

Q&A

Python 3.13 移除了 crypt 模块,有什么替代方案吗?

Python 3.13 移除了 crypt 模块且官方不提供替代方案。作者为此发布了一个纯 Python 模块 shacrypt512.py,专门实现 SHAcrypt SHA-512 算法,可用于生成和校验 $6$ 格式的 shadow 密码条目。

shacrypt512.py 支持哪些功能?

shacrypt512.py 支持生成 $6$ 格式的 SHAcrypt SHA-512 哈希,可自定义盐和轮数(默认 5000 轮),并能校验密码是否与已有的 $6$ 哈希匹配。

如何用 shacrypt512.py 替换 crypt.crypt 的调用?

将 crypt.crypt(password, salt=crypt.METHOD_SHA512) 替换为 shacrypt512.shacrypt(password.encode('utf-8'));将 crypt.crypt(password, '$6$salt$...') 替换为 shacrypt512.shacrypt(password.encode('utf-8'), b'salt');将 crypt.crypt(password, '$6$salt$...') == '$6$salt$...' 替换为 shacrypt512.password_ok(password.encode('utf-8'), '$6$salt$...')。

shacrypt512.py 的默认盐和轮数是多少?

默认盐是随机生成的 16 字节(通过 secrets.token_bytes 生成并编码),默认轮数是 5000。

shacrypt512.py 如何校验密码?

使用 password_ok(input_password, existing_crypted_password) 函数,它会从已有的 $6$ 哈希中提取盐和轮数,重新计算哈希并与原哈希比较,返回布尔值。

shacrypt512.py 的测试用例有哪些?

模块包含两个测试用例:1) 密码 'Hello world!',盐 'saltstring',轮数 5000,生成哈希 '$6$saltstring$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJuesI68u4OTLiBFdcbYEdFCoEOfaS35inz1';2) 密码 'Hello world!',盐 'saltstringsaltstring',轮数 10000,生成哈希 '$6$rounds=10000$saltstringsaltst$OW1/O6BYHV6BcXZu8QVeXbDWra3Oeqh0sbHbbMCVNSnCM/UrjmM0Dp8vOuZeHBy/YTBmSK6H9qs/y3RnOaw5v.'。

🏷️

标签

➡️

继续阅读