使用用户密码的哈希版本进行腌制与使用预定义字符串进行腌制一样安全吗?

时间:2010-12-20 17:08:21

标签: php security hash passwords salt

基本上,我要问的是,如果通过在其末尾附加散列版本来保存密码,就像使用不同的字符串进行腌制一样安全。所以:

这是:

$pass = "pass";
$salt = sha1(md5($pass));
$pass = md5($pass.$salt);

这样安全吗?

$pass = "pass";
$salt = "4D9ds*^dkrUI45^#dkd*3fD8&!dlvd*";
$pass = md5($pass.$salt);

3 个答案:

答案 0 :(得分:4)

如果盐基于要散列的值,则会丢失盐的值。

如果密码哈希盐仅基于密码的值,那么使用相同密码的两个用户在数据库中非常明显,例如。

您应该在不同的可确定值上添加salt。常用选项包括用户名,电子邮件等字段。

答案 1 :(得分:3)

第一个示例与哈希一样安全,而根本不使用任何salt ,因为它仍然只需要密码而无需破解。换句话说,你只是将散列函数应用于同一个东西几次。

更好的选择仍然是为每个用户创建一个盐并分别存储在一起。我想,每个人都可以使用固定的盐,因为你无法使用密码来确定盐。但是,为每个用户生成一个独特的盐甚至更好,因为它需要更多信息而不仅仅是密码来破解它(例如用户名,注册日期或其他信息)。

答案 2 :(得分:2)

你不应该使用md5,因为它已被破解。 sha256更安全,同样易于实现。 在存储数据时如何使用:

$salt = mt_rand();
$pass = hash('sha256',$_POST['userPassword'] . $salt);

因此$ salt不是基于任何用户输入的数据,而是基于随机数据。然后,您可以按原样在数据库中存储$ salt,或者反转字符串以进行模糊处理。