基本上,我要问的是,如果通过在其末尾附加散列版本来保存密码,就像使用不同的字符串进行腌制一样安全。所以:
这是:
$pass = "pass";
$salt = sha1(md5($pass));
$pass = md5($pass.$salt);
这样安全吗?
$pass = "pass";
$salt = "4D9ds*^dkrUI45^#dkd*3fD8&!dlvd*";
$pass = md5($pass.$salt);
答案 0 :(得分:4)
如果盐基于要散列的值,则会丢失盐的值。
如果密码哈希盐仅基于密码的值,那么使用相同密码的两个用户在数据库中非常明显,例如。
您应该在不同的可确定值上添加salt。常用选项包括用户名,电子邮件等字段。
答案 1 :(得分:3)
第一个示例与哈希一样安全,而根本不使用任何salt ,因为它仍然只需要密码而无需破解。换句话说,你只是将散列函数应用于同一个东西几次。
更好的选择仍然是为每个用户创建一个盐并分别存储在一起。我想,每个人都可以使用固定的盐,因为你无法使用密码来确定盐。但是,为每个用户生成一个独特的盐甚至更好,因为它需要更多信息而不仅仅是密码来破解它(例如用户名,注册日期或其他信息)。
答案 2 :(得分:2)
你不应该使用md5,因为它已被破解。 sha256更安全,同样易于实现。 在存储数据时如何使用:
$salt = mt_rand();
$pass = hash('sha256',$_POST['userPassword'] . $salt);
因此$ salt不是基于任何用户输入的数据,而是基于随机数据。然后,您可以按原样在数据库中存储$ salt,或者反转字符串以进行模糊处理。