0

0

Python 随机数生成的原理与安全性

舞夢輝影

舞夢輝影

发布时间:2026-01-30 17:15:20

|

692人浏览过

|

来源于php中文网

原创

Python的random模块不安全,因其基于可预测的Mersenne Twister算法;应改用secrets模块或os.urandom()生成密码学安全随机数,避免使用非明确声明“cryptographically secure”的函数。

python 随机数生成的原理与安全性

Python 的 random 模块不是密码学安全的

绝大多数 Python 程序员调用 random.randint()random.choice() 时,其实用的是 Mersenne Twister(MT19937)算法——它速度快、周期长(2¹⁹⁹³⁷−1),但**完全可预测**:只要知道连续 624 个输出值,就能反推出整个内部状态,进而预测所有后续随机数。

这意味着:

  • random 生成验证码、临时 token、抽奖结果,没问题;
  • 用它生成 API 密钥、加密盐值(salt)、会话 ID,就是严重安全隐患;
  • 即使加了 random.seed(int(time.time())),也毫无意义——时间戳本身可被猜测或爆破。

真正安全的替代方案只有 secrets 模块

Python 3.6+ 内置的 secrets 模块专为密码学安全设计,底层直接调用操作系统提供的熵源(如 Linux 的 /dev/urandom、Windows 的 BCryptGenRandom),不依赖软件算法,不可预测、无状态、不缓存。

常用操作对应关系:

立即学习Python免费学习笔记(深入)”;

  • 代替 random.randint(a, b)secrets.randbelow(b - a + 1) + a
  • 代替 random.choice(seq)secrets.choice(seq)
  • 生成 token(如 URL 安全 Base64)→ secrets.token_urlsafe(32)
  • 生成十六进制密钥 → secrets.token_hex(16)(32 字符);

注意:secrets 不提供 random.shuffle() 这类原地打乱方法,需手动实现 Fisher-Yates 并配合 secrets.randbelow()

雷驰html商城
雷驰html商城

可以生成html页面,大大减轻服务器负担,更加增加网站在搜索引擎出现的几率增机无限级分类功能,分类设置随心所欲 增加商品VIP价格、代理价格、批发价格功能,并且可以很轻松的扩展出更多价格 针对目前网上流行的上传攻击,重新编写了上传模块的代码,杜绝上传漏洞,确保商城的安全性 优化conn.asp 加强SQL注入预防机制,让系统坚不可催 增加订单费用加收百分比功能,邮费设置更合理 后台查看修改商品增加

下载

os.urandom() 是更底层但更灵活的选择

secrets 模块无法满足需求(比如要控制字节长度、自定义编码逻辑),可直接使用 os.urandom(n)——它返回 n 字节的加密安全随机数据,是 secrets 的基础。

常见误用点:

  • os.urandom(4) 当作整数直接用 → 实际是 bytes,需转成 int:int.from_bytes(os.urandom(4), 'big')
  • 在循环里反复调用 os.urandom(1) 生成大量小随机数 → 性能差,应一次取够再切片;
  • 试图用 struct.unpack() 解析 os.urandom() 结果却不校验字节长度 → 可能抛 struct.error

第三方库如 pycryptodome 不该用于“替代 random”

有人看到 Crypto.Random 就以为更高级,其实它和 os.urandom() 底层同源,只是封装冗余;而旧版 pycrypto 已废弃且有已知漏洞。除非你在写密码学协议(如实现 HMAC、AES-GCM),否则没必要引入这些库来“生成随机数”。

真正需要警惕的是那些文档没明确写“cryptographically secure”的工具函数,比如某些 web 框架的 generate_random_string() ——务必查源码或文档确认是否基于 secretsos.urandom()

最常被忽略的一点:Djangoget_random_string() 默认不安全(基于 random),必须显式传参 allowed_chars=string.ascii_letters + string.digits 并配合 secrets.choice 手动重写——它本身不自动升级为安全模式。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

483

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

297

2023.10.25

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6197

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

820

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1071

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1363

2024.03.01

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

483

2023.08.02

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

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

精品课程

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

共48课时 | 8.1万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

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

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