我正在重新设计我的应用程序,我需要有一个独特的盐。
我提供了它的方式,我期待听到这是不是以正确的方式或其他方式改进它。
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;
}
感谢。同样,我的问题是,如果这看起来是正确的方式,你不能看到严重的缺点。
答案 0 :(得分:3)
嗯,从理论上讲,盐只需要是唯一的,因为没有其他密码可以使用该盐进行哈希处理。这个想法是让坏人破解哈希是不可行的。如果你使用salt,并正确地散列密码(即使用像bcrypt,scrypt,pbkdf2等那样的东西),那么只需要很长时间就可以破解一些密码 - 更不用说整个数据库了。 / p>
在实践中,随机产生的足够长的盐不太可能发生一次以上,所以它们应该更好。
在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小时只是一个例子 - 需要多长时间取决于一些事情,但你明白了。)
答案 1 :(得分:0)
不将盐存储在同样包含密码哈希值的数据库中会导致将未知字符串添加到预先哈希的字符串中的目的吗?
如果黑客获得数据库访问权限,并且只访问数据库,则他们将拥有盐和哈希值。如果在PHP定义中声明了静态salt,则需要服务器访问以及数据库访问才能获得相同的信息。
同样相关的是,如果可能,您应该从SQL用户中删除输出权限,以便黑客can't put shells on your server with just database access获取PHP定义的盐。