Exc*_*n e 33 php security random passwords hash
我想创建一个令牌生成器,它生成用户无法猜到并且仍然是唯一的令牌(用于密码重置和确认码).
我经常看到这段代码; 是否有意义?
md5(uniqid(rand(), true));
Run Code Online (Sandbox Code Playgroud)
根据评论 uniqid($prefix, $moreEntopy = true)
收益率
前8个十六进制字符= Unix时间,最后5个十六进制字符=微秒.
我不知道如何$prefix
处理参数..
因此,如果您未将$ moreEntopy标志设置为true,则会提供可预测的结果.
问: 但是如果我们用uniqid
用$moreEntopy
,有什么用MD5哈希它买我们?它比以下更好:
md5(mt_rand())
Run Code Online (Sandbox Code Playgroud)
edit1:我将此令牌存储在具有唯一索引的数据库列中,因此我将检测列.可能有兴趣/
roo*_*ook 43
rand()是一个安全隐患,永远不应该用于生成安全令牌:rand()vs mt_rand()(看看像图像一样的"静态").但是这些生成随机数的方法都不是加密安全的.要生成安全的secerts,应用程序将需要访问由平台,操作系统或硬件模块提供的CSPRNG.
在Web应用程序中,安全机密的良好来源是对诸如熵池的非阻塞访问/dev/urandom
.从PHP 5.3开始,PHP应用程序可以使用openssl_random_pseudo_bytes()
,Openssl库将根据您的操作系统选择最佳的熵源,在Linux下这意味着应用程序将使用/dev/urandom
.斯科特的这段代码非常好:
function crypto_rand_secure($min, $max) {
$range = $max - $min;
if ($range < 0) return $min; // not so random...
$log = log($range, 2);
$bytes = (int) ($log / 8) + 1; // length in bytes
$bits = (int) $log + 1; // length in bits
$filter = (int) (1 << $bits) - 1; // set all lower bits to 1
do {
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
$rnd = $rnd & $filter; // discard irrelevant bits
} while ($rnd >= $range);
return $min + $rnd;
}
function getToken($length=32){
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
for($i=0;$i<$length;$i++){
$token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))];
}
return $token;
}
Run Code Online (Sandbox Code Playgroud)
Sco*_*ott 21
这是我发现的另一个问题的副本,这个问题在此之前几个月被问到.以下是问题和答案的链接:https://stackoverflow.com/a/13733588/1698153.
我不同意接受的答案.根据PHP自己的网站"[uniqid] does not generate cryptographically secure tokens, in fact without being passed any additional parameters the return value is little different from microtime(). If you need to generate cryptographically secure tokens use openssl_random_pseudo_bytes()."
我不认为答案可能比这更清楚,uniqid
不安全.
我知道这个问题已经过时了,但它出现在谷歌,所以...
正如有人说,rand()
,mt_rand()
或uniqid()
将不能保证您独特性......甚至openssl_random_pseudo_bytes()
不应该被使用,因为它使用OpenSSL的建议使用的功能.
你应该用来生成随机哈希(与md5相同)的是random_bytes()(在PHP7中引入).要生成与MD5长度相同的哈希:
bin2hex(random_bytes(16));
如果您使用的是PHP 5.x,则可以通过包含random_compat库来获得此功能.