PHP随机数安全
0x00 rand()函数
rand()的随机数默认最大32767,可以用于爆破这里不再举例。
0x01 mt_rand()和mt_srand()函数
mt_srand()函数用于播种,PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,当PHP版本到了5.2.1后,通过修改算法修补了奇数和偶数的播种相等的问题,这样也导致了php5.2.0前后导致同一个播种后的mt_rand()的值不一样
5.2.6>php>4.2.0默认播种的算法也不是很强悍,当目标>5.20时候,我们exp运行的环境也要是>5.20的版本,mt_rand处理的数据都是不安全的。在web应用里很多都使用mt_rand来处理随机的session,比如密码找回功能等等。
如果你知道一个mt_rand()的值就可以,就可以推断出mt_srand()的种子值,从而推断出下一个mt_rand()值。
工具:http://download.openwall.net/pub/projects/php_mt_seed/php_mt_seed-3.2.tar.gz
root@kali:~# php5 -r ‘mt_srand(123123123); echo mt_rand(),”\n”; echo mt_rand(),”\n”;’
519979806
1474031914
root@kali:~/php_mt_seed-3.2# ./php_mt_seed 519979806
Found 0, trying 100663296 - 134217727, speed 34831590 seeds per second
seed = 123123123
Found 1, trying 1509949440 - 1543503871, speed 34497359 seeds per second
seed = 1525862101
Found 2, trying 3992977408 - 4026531839, speed 34601190 seeds per second
seed = 3994356879
Found 3, trying 4261412864 - 4294967295, speed 34578163 seeds per second
Found 3
可见程序给出了三个种子,逐个测试即可:
root@kali:~# php5 -r ‘mt_srand(1525862101); echo mt_rand(),”\n”; echo mt_rand(),”\n”;’
519979806
14803299
root@kali:~# php5 -r ‘mt_srand(3994356879); echo mt_rand(),”\n”; echo mt_rand(),”\n”;’
519979806
978260809
123123123为真正的种子,这样就可以轻松拿到真正的种子,下一个要产生的随机数也就知道了
PHP随机数安全的更多相关文章
- .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
.Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数: ; i < ; i++) { Rando ...
- DotNet生成随机数的一些方法
在项目开发中,一般都会使用到“随机数”,但是在DotNet中的随机数并非真正的随机数,可在一些情况下生成重复的数字,现在总结一下在项目中生成随机数的方法. 1.随机布尔值: /// <summa ...
- JavaScript 随机数
JavaScript内置函数random(seed)可以产生[0,1)之间的随机数,若想要生成其它范围的随机数该如何做呢? 生成任意范围的随机数 //生成[100,120)之间的随机数 Math.fl ...
- SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等
在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数.那就看下面 ...
- 随机数(random)
需求 Random rd=new Random(); 需要十以内的随机数 (0---10) System.out.println((int)((rd.nextDouble()*100)/10)); ...
- [LeetCode] Insert Delete GetRandom O(1) 常数时间内插入删除和获得随机数
Design a data structure that supports all following operations in average O(1) time. insert(val): In ...
- Python 随机数用法
1. random.seed(int) 给随机数对象一个种子值,用于产生随机序列. 对于同一个种子值的输入,之后产生的随机数序列也一样. 通常是把时间秒数等变化值作为种子值,达到每次运行产生的随机系列 ...
- C语言产生标准正态分布或高斯分布随机数
C语言 产生标准正态分布或高斯分布 随机数 产生正态分布或高斯分布的三种方法: 1. 运用中心极限定理(大数定理) #include #include #define NSUM 25 double g ...
- C语言基础(11)-随机数发生器
一. rand() rand是一个C语言库函数,功能是生成一个随机数.rand需要一个不同的种子,才能生成不同的随机数. 二. srand(int seed) rand需要一个不同的种子,才能生成不同 ...
- shell 指定范围产生随机数
#/bin/bash echo "---------------产生随机数---------------" read -p "请输入起始数:" a read - ...
随机推荐
- Spring 使用context:annotation-config的设置
Spring 使用context:annotation-config的设置: 还是需要声明Bean的,并且还可能自己定义Annotation: xml: <?xml version=" ...
- java调用oracle存储过程,返回结果集
package com.srie.db.pro; import java.sql.CallableStatement; import java.sql.Connection; import java. ...
- Mac bash rc
###################################### ########## .bashrc ###################################### cas ...
- UWP 律师信息 MVVM 2.0版本
由于1.0版本存在一个很大的BUG,一直也没有找到问题所在,后来,一位在微软的朋友说,他们的测试小妹给出的结果是框架的问题,所以,就直接整体重构了代码,也布局设计上,由跳转页面变为了UWP常见的左侧列 ...
- KB奇遇记(7):不靠谱的项目实施计划
在ERP项目启动前期,项目组两方项目经理和我等几个人单独跟总裁开会,讨论了初步的ERP实施计划,本来第一期上线只是考虑上其中一家工厂而已,结果临时加入了深加工的工厂.本来项目组预定计划是2017年1月 ...
- jquery在Asp.net下实现ajax
前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AjaxTest ...
- Jasmine基础语法
简介 Jasmine 是JavaScript的测试框架,它不依赖其他框架,也不依赖DOM,更重要的是它语法简单.以下实例都是基于Jasmine 2.5.2的,并且来自官网:https://jasmin ...
- 使用node-inspector调试nodejs程序<nodejs>
1.npm install -g node-inspector // -g 导入安装路径到环境变量 一般是c盘下AppData目录下 2.node-inspector & //启动node- ...
- SQL Server-聚焦深入理解动态SQL查询(三十二)
前言 之前有园友一直关注着我快点出SQL Server性能优化系列,博主我也对性能优化系列也有点小期待,本来打算利用周末写死锁以及避免死锁系列的接着进入SQL Server优化系列,但是在工作中长时间 ...
- Match类解析
Matcher类:使用Matcher类,最重要的一个概念必须清楚:组(Group),在正则表达式中()定义了一个组,由于一个正则表达式可以包含很多的组,所以下面先说说怎么划分组的,以及这些组和组的下标 ...