Python 3.4环境能否使用secrets模块?无则求功能相近第三方模块
很遗憾,没办法通过from __future__ import ...的方式在Python 3.4里导入标准库的secrets模块。因为__future__这个导入语句是用来提前启用Python未来版本的语法特性或者语言层面的变更的,而secrets是Python 3.6才新增的完整标准库模块,不属于语法或语言规则的范畴,所以__future__管不到它。
不过不用担心,有几个靠谱的第三方方案能实现和secrets几乎一致的安全功能:
1. 第三方secrets兼容包(最省心的选择)
你可以直接安装PyPI上的secrets包,它就是为了兼容旧版Python而生的。安装命令很简单:
pip install secrets
安装之后,你就可以像使用标准库一样写import secrets,它会自动适配环境:在Python 3.6及以上会直接调用标准库的secrets,而在3.4这种旧版本里,它会用自己实现的安全随机数逻辑,完全兼容标准库secrets的所有常用API——比如secrets.token_hex()、secrets.token_urlsafe()、secrets.choice()这些方法都能正常使用,几乎不需要改代码。
2. cryptography工业级加密库
如果你的项目已经在使用加密相关的功能,cryptography是个非常靠谱的工业级选择。你可以基于它的底层安全随机方法来封装类似secrets的功能,示例代码如下:
import os import base64 # 生成安全随机字节,对应secrets.token_bytes(16) def token_bytes(nbytes=16): return os.urandom(nbytes) # 生成十六进制格式的token,对应secrets.token_hex(16) def token_hex(nbytes=16): return token_bytes(nbytes).hex() # 生成URL安全的base64格式token,对应secrets.token_urlsafe(16) def token_urlsafe(nbytes=16): return base64.urlsafe_b64encode(token_bytes(nbytes)).rstrip(b'=').decode('utf-8')
不过这种方式需要你自己封装常用方法,不如上面的兼容包省心,但胜在功能更全面,如果项目本身依赖cryptography,这会是个不错的选择。
3. 手动封装(应急可用,不推荐长期使用)
如果实在不想安装额外依赖,也可以基于Python 3.4自带的os.urandom()来手动封装类似secrets的核心方法——就像上面示例里的那样。不过这种方式需要你自己确保实现的安全性,不如成熟的第三方包经过充分测试,所以只建议在非常简单的应急场景下使用。
内容的提问来源于stack exchange,提问作者Stew

