我有一个脚本,我在PHP中使用rand函数.现在我读了一些鬼故事,它真的很容易预测那些结果.这可能来自客户端吗?
例如,假设我们有一个rand(0,10)
.是否有可能预测下一个数字?
Luc*_*one 35
rand()
函数返回伪随机数.这并不意味着next
可以预测数量.然而,这个图像可以解释单词的概念pseudorandom
你可以阅读这篇文章
图像是从一个带有rand
Windows系统功能的简单循环生成的.
header("Content-type: image/png");
$im = imagecreatetruecolor(512, 512) or die("Cannot Initialize new GD image stream");
$white = imagecolorallocate($im, 255, 255, 255);
for ($y = 0; $y < 512; $y++) {
for ($x = 0; $x < 512; $x++) {
if (rand(0, 1)) {
imagesetpixel($im, $x, $y, $white);
}
}
}
imagepng($im); imagedestroy($im);
Run Code Online (Sandbox Code Playgroud)
它不是那么随意,真的吗?但既然你已经知道了......你可以预测下一个号码吗?
真随机数发生器(TRNG)和伪随机数发生器(PRNG)之间的区别在于TRNG使用不可预测的物理手段来生成数字(如大气噪声),PRNG使用数学算法(完全由计算机生成)
[...]
没有多少PRNG会像这样产生明显的视觉模式,它恰好是语言(PHP),操作系统(Windows)和功能(rand())的非常糟糕的组合.
你必须暴力破坏PRNG的状态.http://crypto.di.uoa.gr/CRYPTO.SEC/Randomness_Attacks_files/paper.pdf
PHP的rand()使用底层的标准库实现,这是基于操作系统的不同.
首先,定义操作系统.
下一步,获取Rand()函数的源代码和播种它的代码.
为简单起见,我们假设PRNG的种子就像服务器的毫秒时间.因此,HTTP请求进来,PHP播种PRNG并执行rand(0,10).如果你想预测你会......
将客户端的时钟同步到服务器,从统计上获取从发送HTTP请求到服务器的准确时间,并使用时间戳读取响应HTTP标头.
种子客户端PRNG(与服务器的实现方式相同)预测的未来时间,您将从服务器请求rand(0,10).在客户端上运行rand(0,10),将请求在确切的将来时间发送到服务器,结果将是相同的.
Ping时间,处理时间等使这成为一种相当强力的方法.
真的,通过互联网(没有直接访问服务器),你不会有太多的运气预测PHP的rand()函数的结果.
归档时间: |
|
查看次数: |
3726 次 |
最近记录: |