[web 安全] php随机数安全问题
and() 和 mt_rand() 產生隨機數
srand() 和 mt_srand() 播種隨機數種子(seed)
使用:
隨機數種子一樣,隨機數序列則會完全一相同。
所以知道隨機數種子后,就能知道所有隨機數序列。(隨機數種子 => 隨機數序列)
知道隨機數后,也能推出隨機數種子。(隨機數 => 隨機數種子 => 隨機數序列)
<?php/* 通過隨機數反推隨機數種子 */ srand(123); $_rand = rand(); echo "rand:{$_rand}\n"; $max = mt_getrandmax(); for ($i=0; $i < $max; $i++) { srand($i);if(rand() == $_rand){echo "rand seed:{$i}\n";break;} } ?>
《白帽子講 web 安全》:
在 php 5.2.1 及其之后的版本中調整了隨機數的生成算法,但強度未變,因此在猜解種子時應在對應的php版本中進行。
在 Stefan Esser 的文中還提到一個小技巧,可以通過發送 Keep-Alive HTTP頭,迫使服務器端使用同一PHP進程相應請求,而在該PHP進程中,
隨機數在使用時只會在一開始播種一次。
《聊一聊隨機數安全》:
int rand(void)
int rand(int $min, int $max)
如果沒有提供參數min,max,rand()返回0到getrandmax()之間的偽隨機整數,但是getrandmax()在window下返回32767,也就是window下rand()的范圍是0到32767
mt_rand()對應的是mt_getrandmax(),返回2147483647。
安全建議:
1、業務場景需要使用隨機數,一定要使用隨機數,比如Token的生成。
2、隨機數要足夠長,避免暴力破解。
3、保證不同用處的隨機數使用不同的種子,避免通過隨機數推出隨機數種子,從而得到隨機數序列。
4、對安全性要求高的隨機數(如密碼技術相關)禁止使用弱偽隨機數(mt_rand()比rand()強)。
4.1 不要使用時間函數作為隨機數。
4.2 不要使用弱偽隨機數生成器(rand()范圍小;mt_rand()存在缺陷)。
5、強偽隨機數
?
轉載于:https://www.cnblogs.com/natian-ws/p/7641093.html
總結
以上是生活随笔為你收集整理的[web 安全] php随机数安全问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二分图 crf的军训
- 下一篇: 表单绑定