【发布时间】:2018-04-17 14:54:57
【问题描述】:
我不想生成令牌来验证用户的电子邮件,我了解了通用hashing(从一系列哈希函数中随机选择一个哈希函数),我在PHP中编写了这段代码
生成令牌是否安全?
$string ='';
$length = 60;
$pattern = 'abcdefghijklmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY0123456789';
$hashList = array('sha256','sha384','sha512','ripemd256','ripemd320','openssl_random_pseudo_bytes');
$randNumber = mt_rand(0, 6);
for($i=0; $i<$length; $i++)
{
$string .= $pattern[rand()%strlen($pattern)];
}
switch ($randNumber) {
case 0:
return substr(hash($hashList[$randNumber],$string),0,$length);
break;
case 1:
return substr(hash($hashList[$randNumber],$string),0,$length);
break;
case 2:
return substr(hash($hashList[$randNumber],$string),0,$length);
break;
case 3:
return substr(hash($hashList[$randNumber],$string),0,$length);
break;
case 4:
return substr(hash($hashList[$randNumber],$string),0,$length);
break;
case 5:
return substr(bin2hex($hashList[$randNumber]($length)),0,$length);
break;
default:
return $string;
break;
}
【问题讨论】:
-
不,永远不要推出自己的加密货币。在这种情况下,您只需要使用适当的随机源,这应该足够了
$token = bin2hex(openssl_random_pseudo_bytes(16)); -
所有这些矫枉过正的“加密货币”和一个重要的位 (
rand()) 都使其易受攻击。 @JimL 是对的,使用那一行。 -
使用确定性伪随机数生成器在密码学上永远不会安全。它只是创建了一个额外的攻击向量,即有人可以通过知道你的初始种子来预测令牌。
-
即使
openssl_random_pseudo_bytes()也不总是加密安全的;使用random_bytes()。
标签: php security token universal-hashing