Php 对令牌随机数据进行哈希处理是否会提高安全性?

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(

我使用phpass生成随机密码和密码散列,但我的问题是对于密码重置之类的事情,我创建了一个唯一的令牌。基本上我抓取16字节的随机数据,然后通过sha256散列传递它。这是一个好的做法还是我应该坚持使用16字节的数据

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

在这种情况下,唯一可能的安全漏洞是

  • 使用sql注入从数据库中提取所有密码和密码
  • 在盐的生成过程中发现了一种模式
  • 根据预测的盐制作了彩虹表
  • 再次从数据库中获取数据
  • 使用rainbow表从数据库中破解大量密码

  • 所以基本上,不,它没有增加安全性。此外,您上面的代码使用了/dev/uradom,它提供了非常强的随机性,因此,由于上面列出的步骤2或多或少是不可能的,所以这种好处甚至会进一步减少。只有NSA、CIA和类似的组织受到了猛烈的攻击。

    是的,散列随机数据以获得密码重置令牌绝对可以提高安全性

    非散列令牌有助于破坏帐户的场景:

    攻击者

  • 获取对数据库的读取权限
  • 等待令牌出现在密码重置令牌表中
  • 获取令牌、关联的电子邮件地址和URL

    http://example.com/password_reset?t=gobble-迪顾代币

  • 现在可以更改关联电子邮件地址的密码


  • 通过phpass散列,即使攻击者获得了对数据库的读取权限,也不能使用密码重置功能来破坏帐户。这是因为他们不能使用令牌的散列来创建URL。

    我添加了用于获取随机字节的函数,通常是32字节,然后使用该函数生成字母数字字符串。但我想问题是hasing是否以任何方式降低了安全性?将答案扩展到更完整的答案。这里有两个不同的问题。正如@regality所写的,散列随机数据以创建令牌并没有任何改进,但在令牌存储到数据库中之前,散列非常重要。如果令牌是强的(20个字符a-z a-z 0-9),那么不含盐的简单散列(SHA-256)是安全的,这使得它可以在数据库中搜索。