Php 对令牌随机数据进行哈希处理是否会提高安全性?
我使用phpass生成随机密码和密码散列,但我的问题是对于密码重置之类的事情,我创建了一个唯一的令牌。基本上我抓取16字节的随机数据,然后通过sha256散列传递它。这是一个好的做法还是我应该坚持使用16字节的数据Php 对令牌随机数据进行哈希处理是否会提高安全性?,php,hash,passwords,token,Php,Hash,Passwords,Token,我使用phpass生成随机密码和密码散列,但我的问题是对于密码重置之类的事情,我创建了一个唯一的令牌。基本上我抓取16字节的随机数据,然后通过sha256散列传递它。这是一个好的做法还是我应该坚持使用16字节的数据 private static function get_random_bytes($count) { $output = ''; if (is_readable('/dev/urandom') && ($fh = @fopen(
private static function get_random_bytes($count) {
$output = '';
if (is_readable('/dev/urandom') &&
($fh = @fopen('/dev/urandom', 'rb'))) {
$output = fread($fh, $count);
fclose($fh);
}
$random_state = microtime();
if (function_exists('getmypid'))
$random_state .= getmypid();
if (strlen($output) < $count) {
$output = '';
for ($i = 0; $i < $count; $i += 16) {
$random_state =
md5(microtime() . $random_state);
$output .=
pack('H*', md5($random_state));
}
$output = substr($output, 0, $count);
}
return $output;
}
私有静态函数获取随机字节($count){
$output='';
如果(是可读的('/dev/uradom'))&&
($fh=@fopen('/dev/uradom','rb')){
$output=fread($fh,$count);
fclose($fh);
}
$random_state=microtime();
如果(函数_存在('getmypid'))
$random_state.=getmypid();
如果(strlen($output)<$count){
$output='';
对于($i=0;$i<$count;$i+=16){
$random_状态=
md5(微时间().$random_状态);
$output=
包装('H*',md5($random_state));
}
$output=substr($output,0,$count);
}
返回$output;
}
如果随机数据的加密能力很强,那么不需要对其进行散列
如果您的数据不具有加密能力,例如使用rand()
检索的值,则哈希可能会稍微安全一些,但好处很小,您应该使用更强大的PRNG
在这种情况下,唯一可能的安全漏洞是
所以基本上,不,它没有增加安全性。此外,您上面的代码使用了/dev/uradom,它提供了非常强的随机性,因此,由于上面列出的步骤2或多或少是不可能的,所以这种好处甚至会进一步减少。只有NSA、CIA和类似的组织受到了猛烈的攻击。是的,散列随机数据以获得密码重置令牌绝对可以提高安全性 非散列令牌有助于破坏帐户的场景: 攻击者
http://example.com/password_reset?t=gobble-迪顾代币
通过phpass散列,即使攻击者获得了对数据库的读取权限,也不能使用密码重置功能来破坏帐户。这是因为他们不能使用令牌的散列来创建URL。我添加了用于获取随机字节的函数,通常是32字节,然后使用该函数生成字母数字字符串。但我想问题是hasing是否以任何方式降低了安全性?将答案扩展到更完整的答案。这里有两个不同的问题。正如@regality所写的,散列随机数据以创建令牌并没有任何改进,但在令牌存储到数据库中之前,散列非常重要。如果令牌是强的(20个字符a-z a-z 0-9),那么不含盐的简单散列(SHA-256)是安全的,这使得它可以在数据库中搜索。