php - 使用 PHP 的 mt_rand() 生成哈希盐的安全性?

标签 php hash salt prng

我正在尝试生成河豚哈希,我想知道依赖 mt_rand() 为我生成盐是否足够安全?

function blowfish($string, $salt = NULL, $iterations = '08')
{
    if( ! $salt)
    {
        $seed = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        for ($i = 0; $i < 22; $i++)
        {
            $salt .= $seed{mt_rand(0, 63)};
        }
        $salt = '$2a$' . $iterations . '$' . $salt;
    }

    return crypt($string, $salt);
}

上面的字符 $seed 是允许的 64 个字符 blowfish-salt alphabet 。我计划使用它来生成和比较密码。

$password = 'my^$%#password';
$hash = blowfish($password);

if($hash = blowfish($password, $hash))
{
    print "Matches\n";
    print $hash . "\n";
}

编辑

我从来没有意识到这一点,但@zerkms 说的是真的。盐只是为了防止可重用的预计算攻击,因为盐在它们可以访问哈希的同一点上是已知的。所以目标不是不可逆盐 - 它是随机盐。

那么,这有什么问题吗?

function blowfish($string, $salt = NULL, $iterations = '12')
{
    return crypt($string, $salt ?: "$2a\$$iterations$" . md5(uniqid('', true)));
}

此外,如标题和上面的代码所述,我实现我自己的哈希算法。

更新2

如果已加载则使用 mcrypt 扩展会导致以下结果,这实际上更快可能是因为 uniqid (u)sleep 或其他原因。

function blowfish($string, $salt = NULL, $iterations = '12')
{
    return crypt($string, $salt ?: "$2a\$$iterations$" . base64_encode(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)));
}

更新3

base64_encode 比 md5 快 - 但它有 无效 河豚字符,如 +。所以现在改成了md5。

function blowfish($string, $salt = NULL, $iterations = '12')
{
    return crypt($string, $salt ?: "$2a\$$iterations$" . md5(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)));
}

最佳答案

使用mcrypt来制造盐。

关于php - 使用 PHP 的 mt_rand() 生成哈希盐的安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10183103/

相关文章:

hash - 加盐您的密码 : Best Practices?

php - 如何在所有浏览器的每个回显中正确显示输出?

hash - MD5的时间复杂度

hash - Docker如何计算每一层的hash?它是确定性的吗?

javascript - 从两个不同的值创建一个公共(public)键,不考虑顺序

ruby-on-rails - 是否可以单独访问bcrypt盐?

hash - 如果有人获得了加盐 key ,加盐密码是否毫无意义?关闭服务器加盐?

php - 如何检索数组中与查询关联的其他值?

php - 实例化从 AwsClient 子类扩展的类时出错

javascript - 在等待来自另一个站点的值时显示或隐藏 div 元素