浅谈PHP伪随机数(1)

156 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

什么是php伪随机数

让我们先观察一下这两个函数

mt_scrand()
mt_rand()  

mt_scrand(seed)这个函数的意思就是分发seed种子,种子有了后,靠mt_rand()生成随机数。

例如我们写一个脚本

<?php  
mt_srand(55555);    
echo mt_rand()."<br/>";
?> 
//输出277249736

如果我们多输入几次呢

<?php  
mt_srand(12345);    
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
?>
//输出277249736<br/>230135029<br/>1872932720<br/>1536240435<br/>

大家可以发现,这个随机数是不是不是这么随机,这就是伪随机数的漏洞,存在可预测性。

为了方便理解,我将其认为是线性的给大家画个图演示一下

(画的不好不要在意)x就是我们所说的种子,知道了种子和伪随机数就可以推y了

通过以上的举例说明,我们便可以推出以下的结论:

1.当我们知道种子数,便可以推出伪随机数列。

2.当我们知道伪随机数列,便可以推出种子。

当我们知道这些后,大家可以想一下,应该如何破解伪随机数呢?我们接下来来介绍一个工具

php_mt_seed

该工具专门用来爆破种子

贴一个官方网站:www.openwall.com/php_mt_seed…

用法:

将文件夹放进kali,进入该文件目录里,首次使用先输入make,然后

./php_mt_seed 所要爆破的随机数

我们举几个例子

example1

先写一个脚本

<?php
function user_password() {


    return mt_rand();
    
    }
    
    echo user_password(), "\n";
    
    echo user_password(), "\n";
    
    echo user_password(), "\n";
    
    echo user_password(), "\n";


?>

我们随机分配密码,运行后

266584478
1966871117
983911992
151017562

如果我们只知道第一个密码,也就是266584478,那我们是否能利用工具将后面三个密码给推出来呢,我们用上面提到的工具对第一个密码进行爆破

跑出来种子276062199(这里注意一点php版本是要匹配的,否则随机出来的数是不同的)

接下来我们写个脚本,已知种子跑随机数

<?php
mt_srand(276062199);


for($i=0;$i<4;$i++){


echo mt_rand()." ";


}
?>

运行出来

266584478 1966871117 983911992 151017562 

可以看到我们推出了后三个密码,当然这是最简单的例子,接下来我们进阶一下。