1

我正在重新设计需要独特盐的应用程序。

我提供了它的方式,我期待听到这是否不能以正确的方式或其他我可以改进的方式工作。

public function generatesalt($x=0)
{
    $x++;

    $string = md5(uniqid(rand(), true));
    $salt = substr($string, 0, 12);

    $stored = array();
    $qw = $this->registry->dbi->query("SELECT `salt` FROM `".PRE."membership`")->results();
    foreach ($qw as $k => $v)
        $stored[] = $v['salt'];


    if (in_array($salt,$stored))
        return $this->generatesalt($x);

    return $salt." /// ".$x;
}   

谢谢。同样,我的问题是,如果这看起来以正确的方式工作并且您看不到严重的缺点。

4

2 回答 2

3

好吧,从理论上讲,盐只需要在不应该​​使用该盐散列其他密码的意义上是唯一的。这个想法是让坏人破解哈希是不可行的。如果您使用盐,并且正确地散列密码(即使用 bcrypt、scrypt、pbkdf2 等),那么破解少数密码将需要很长时间——更不用说整个数据库了。

在实践中,足够长的随机生成的盐不太可能出现不止一次,因此它们应该非常好。

在 PHP 中,一种生成盐的简单方法是使用mcrypt_create_iv(). 它从系统中生成随机位,可以对其进行编码以便于存储:

function randomSalt($length = 16) {
    $bits = mcrypt_create_iv($length);
    $encoded = base64_encode($bits);
    return substr($encoded, 0, $length);
}
echo randomSalt(); // Something like: "Yt5iX/LvdxOyxCiX"

最后,盐不必是秘密。这不是使用盐的原因。想象一下,你想走到街角的商店。需要 5 分钟。现在,假设您被迫绕道 24 小时。那就是盐。这是一个巨大的障碍,每次破解新的散列密码时,坏人都需要克服。(注意:24 小时只是一个例子——它需要多长时间取决于一些事情,但你明白了。)

于 2013-02-23T23:46:55.863 回答
0

将盐存储在还包含密码哈希的数据库中是否会破坏将未知字符串添加到预哈希字符串的目的?

如果黑客获得数据库访问权限,并且只有数据库访问权限,他们将获得盐和哈希值。如果您在 PHP 定义中声明了静态盐,他们将需要服务器访问权限以及数据库访问权限才能获取相同的信息。

同样相关的是,如果可能,您应该删除 SQL 用户的输出权限,这样黑客就无法仅通过数据库访问将 shell 放在您的服务器上并获取您的 PHP 定义的盐。

于 2013-02-23T23:16:33.857 回答