如何在Python中使用secrets模块生成加密级安全随机数?

浅杰吖_1343

浅杰吖_1343

2026-09-11

985人浏览

原创

不能用random模块生成密钥或token,因其基于可预测的伪随机数生成器,不满足密码学安全要求;应使用secrets模块调用操作系统加密随机源。

如何在python中使用secrets模块生成加密级安全随机数?

为什么不能用random模块生成密钥或token

因为random模块基于伪随机数生成器(如Mersenne Twister),其输出可被预测,不满足密码学安全要求。用它生成API密钥、重置令牌或盐值,等于把锁换成纸糊的——攻击者只要拿到几个输出,就能反推内部状态。

真正该用的是secrets模块,它直接调用操作系统提供的加密安全随机源(Linux上的/dev/urandom,Windows上的BCryptGenRandom),无法被预测或重现。

secrets.token_bytes()和secrets.token_hex()的区别与选型

这两个函数都返回密码学安全的随机字节,但输出格式不同,适用场景也不同:

  • secrets.token_bytes(n)返回n个原始字节,适合直接用于加密操作(如AES密钥、HMAC盐)
  • secrets.token_hex(n)返回2*n长度的十六进制字符串(比如secrets.token_hex(16) → 32位hex字符串),适合日志、URL、数据库存储等需要可读/可传输的场景
  • 别误以为token_hex(16)生成的是16字节——它其实是32字符的hex串,对应16字节;若要32字节密钥,应传32而非16

生成安全密码时,secrets.choice()比random.choice()关键在哪

当你要从字符集里逐个挑字符拼密码(比如大小写字母+数字+符号),必须用secrets.choice(),而不是random.choice()。前者对每个字符都做一次独立的系统级熵采样;后者复用同一个PRNG状态,导致整个密码的熵远低于预期。

示例:生成12位含大小写+数字的密码

python-script-generator
python-script-generator

快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。

下载
import secrets
import string
<p>alphabet = string.ascii<em>letters + string.digits
password = ''.join(secrets.choice(alphabet) for </em> in range(12))</p><h1>✅ 每次调用 secrets.choice() 都是全新熵源</h1><h1>❌ 不要用 random.choice(alphabet) 替代</h1>

注意:secrets.choice()不支持weights参数,也不支持非序列对象——它只接受序列(list/tuple/str),且必须是内存中已存在的对象。

生成URL安全token时,secrets.token_urlsafe()的长度陷阱

secrets.token_urlsafe(n)返回一个经过base64url编码的字符串,长度约ceil(4*n/3),但实际可用字节数仍是n。比如token_urlsafe(32)大概返回44字符,但背后仍是32字节的真随机数据。

常见错误是按最终字符串长度反推熵值。例如认为“44字符的URL token一定比32字符的hex token更安全”——错。安全性取决于原始字节数,不是编码后长度。

建议:明确按字节需求指定n,而不是按显示长度凑数。Web API的bearer token通常至少需32字节,就直接写secrets.token_urlsafe(32)。

另外,token_urlsafe()结果不含+、/、=,可直接放进URL或HTTP头,无需额外urlencode——这点比手写base64.urlsafe_b64encode(secrets.token_bytes(32)).decode()更稳妥,因为后者若忘记.decode()会返回bytes,容易引发类型错误。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

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

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

2023.07.20

1651

4

python能做什么
python能做什么

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

2023.07.25

4124

7

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

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

2023.07.31

1669

3

python教程
python教程

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

2023.08.03

23857

23

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

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

2023.08.04

2927

5

python eval
python eval

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

2023.08.04

2947

5

scratch和python区别
scratch和python区别

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

2023.08.11

1143

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2283

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程