php中的rand,预测PHP的rand()的输出
从中猜测下一个值的rand能力与确定所srand调用内容的能力有关。特别是,以预定数量播种会srand导致可预测的输出!在PHP交互式提示符下:
[charles@charles-workstation ~]$ php -a
Interactive shell
php > srand(1024);
php > echo rand(1, 100);
97
php > echo rand(1, 100);
97
php > echo rand(1, 100);
39
php > echo rand(1, 100);
77
php > echo rand(1, 100);
93
php > srand(1024);
php > echo rand(1, 100);
97
php > echo rand(1, 100);
97
php > echo rand(1, 100);
39
php > echo rand(1, 100);
77
php > echo rand(1, 100);
93
php >
这不仅仅是fl幸。大多数PHP版本*在大多数平台**会生成序列97,97,39,77,93时,srand“d与1024。
要明确的是,这不是PHP的问题,这是其rand自身实现的问题。在使用相同(或相似)实现的其他语言(包括Perl)中也会出现相同的问题。
诀窍是,任何理智的PHP版本都将预先植入srand“未知”值。哦,但这并不是真正未知的。来自ext/standard/php_rand.h:
#defineGENERATE_SEED()(((long)(time(0)*getpid()))^((long)(1000000.0*php_combined_lcg(TSRMLS_C))))
因此,这是一个数学运算符time(),其中包含PID以及PID的结果php_combined_lcg,它们在中定义ext/standard/lcg.c。我不会在这里进行c&p,因为,我的眼睛发呆,所以我决定停止狩猎。
有点谷歌搜索表明PHP的其他区域没有最好的随机性生成属性,并呼吁在php_combined_lcg这里脱颖而出,尤其是以下分析:
此函数(gettimeofday)不仅使我们在银盘上获得了精确的服务器时间戳,而且如果我们要求“更多熵”(来自PHP uniqid),它还会添加LCG输出。
是啊是uniqid。似乎值php_combined_lcg是在调用uniqid第二个参数设置为真值后查看生成的十六进制数字时所看到的。
现在,我们在哪里?
哦是的 srand。
因此,如果您尝试从中预测随机值的代码没有调用srand,则需要确定由提供的值php_combined_lcg,您可以通过调用来(间接获得)该值uniqid。根据手中的价值,这是可行的,以蛮力价值的休息- time(),PID和一些数学。链接的安全性问题是关于中断会话的,但是相同的技术在这里也适用。再次,从文章:
这是上面概述的攻击步骤的摘要:
等待服务器重启
获取唯一值
蛮力从此RNG种子
轮询在线状态以等待目标出现
将状态轮询与uniqid轮询交错,以跟踪当前服务器时间和RNG值
使用轮询中建立的时间和RNG值间隔对服务器进行暴力会话ID
只需根据需要替换最后一步。
(此安全问题是在比我们当前的版本(5.3.6)更早的PHP版本(5.3.2)中报告的,因此,uniqid和/或php_combined_lcg已更改的行为很可能,因此该特定技术可能不再可行。 YMMV。)
另一方面,如果您要尝试人工生成的代码调用srand,那么除非它们使用的结果比的结果好很多倍,否则php_combined_lcg您可能会更容易地猜测出值并为本地设置种子编号正确的发电机。大多数会手动调用的人srand也不会意识到这是多么可怕的想法,因此不太可能使用更好的价值。
值得注意的是,mt_rand同样的问题也困扰着它。mt_srand具有已知值的播种也会产生可预测的结果。基于您的熵openssl_random_pseudo_bytes可能是一个更安全的选择。
tl; dr:为了获得最佳结果,请不要植入PHP随机数生成器,并且出于良善起见,请不要uniqid向用户公开。两者之一或两者都做可能会使您的随机数更容易猜测。
PHP 7更新:
PHP 7.0引入random_bytes和random_int作为核心功能。他们使用基础系统的CSPRNG实现,从而使它们摆脱了种子随机数生成器所具有的问题。它们实际上与相似openssl_random_pseudo_bytes,只是不需要安装扩展程序。 Polyfill可用于PHP5。
*:Suhosin安全补丁会更改的行为,rand并mt_rand始终在每次调用时重新植入种子。Suhosin由第三方提供。默认情况下,某些Linux发行版将其包含在其官方PHP软件包中,而其他发行版则将其作为选项,而其他发行版则完全忽略了它。
**:根据所使用的平台和底层库调用,将生成与此处记录的序列不同的序列,但是除非使用Suhosin补丁,否则结果应仍可重复。
php中的rand,预测PHP的rand()的输出相关推荐
- matlab中怎样生成随机数——随机数生成函数rand家族
随机数的生成在算法编程中非常常用,在matlab中rand(random的缩写)家族经常被使用. 小白一枚,敬请大神指教 rand家族成员 randMatrix = rand(x, y) randMa ...
- 9.Matlab中的repmat,clock,rand以及seed,state,twister参数
1.repmat ------Replicate and tile an array -------复制并且平铺函数 2. clock 3.rand中seed,state,以及twister参数 ...
- c语言中rand()的作用,c语言中rand()函数怎么用? rand函数的用法
导航:网站首页 > c语言中rand()函数怎么用? rand函数的用法 c语言中rand()函数怎么用? rand函数的用法 相关问题: 匿名网友: rand(产生随机数) 相关函数 sran ...
- R语言编写自定义函数、评估回归模型预测变量的相对重要性(Relative importance)、通过在所有可能的子模型中添加一个预测变量而获得的R方的平均增加、评估预测变量的重要度、并通过点图可视化
R语言编写自定义函数.评估回归模型预测变量的相对重要性(Relative importance).通过在所有可能的子模型中添加一个预测变量而获得的R方的平均增加.来评估预测变量的重要程度.并通过点图可 ...
- ML之分类预测:机器学习中多分类预测数据集可视化(不同类别赋予不同颜色)设计思路及代码实现
ML之分类预测:机器学习中多分类预测数据集可视化(不同类别赋予不同颜色)设计思路及代码实现 目录 机器学习中多分类预测数据集可视化(不同类别赋予不同颜色)设计思路及代码实现 代码实现
- 机器学习 - [源码实现决策树小专题]决策树学习中如何进行分类预测
机器学习 - 决策树学习中如何进行分类预测 李俊才 的 CSDN 博客 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.net/qq_28550263? ...
- Science Advances:社会和健康科学中用于描述、预测和因果推理的机器学习方法
社会和健康科学中使用的机器学习(ML)方法需要符合描述.预测或因果推理等预期研究目的.本文通过结合这些学科的统计分析的必要要求,为社会和健康科学中的研究问题与适当的ML方法进行了全面.系统的元映射.作 ...
- TransDecoder识别转录本中编码区并预测蛋白
TransDecoder可以识别转录本序列中的编码区域,如:Trinity从头组装.Tophat和Cufflinks将RNA-Seq比对到基因组转录本结果 TransDecoder 基于以下标准识别可 ...
- 风险管理中的风险预测、风险评估、风险控制
风险管理中的风险预测 风险预测又称风险估计他试图从两个方面评估一个风险风险发生的可能性或概率.如果风险发生了所产生的后果. 风险测评活动 通常,项目计划人员于管理人员,技术人员一起进行下面四步风险预测 ...
最新文章
- C++标准库math
- poj1068解题报告(模拟类)
- mysql忽略大小写配置cnetos_CentOS7下安装MYSQL8.X并设置忽略大小写
- fastjson将json字符串转为Map对象,拿走不谢
- pip: failed to create process.解决方法
- 总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
- 【转】C 从函数返回数组
- 分布式文件系统之ceph是什么?
- Inconsistent behavior between text type in Webclient UI and backend customizing
- pythonsklearn多元回归回归_用sklearn进行多元线性回归
- 【iCore3 双核心板】例程三十五:HTTP_IAP_ARM实验——更新升级STM32
- java list应用_java中list集合的应用
- python 的案例实战_python案例实战之一
- matlab 动画_MATLAB的动画制作和视频录制
- 《Splunk智能运维实战》——第1章 游戏时间——导入数据 1.1 简介
- list集合根据jsonobjectvalue排序_Java之List集合两种排序的性能比较
- protobuf生成java类
- python编程课第七课_Python 第7课 if的介绍和使用
- 利用黑盒测试技术设计测试用例
- 使用jol如何判断一个对象当前处于哪种锁