我以前做的事情:
$salt = md5(time().rand(0,9999999).rand(0,100000));
$hashed_password = sha1($salt.$_REQUEST["newpassword"].sha1($salt));
$query = "update users set password=:hashed_password, salt=:salt where uid=:uid";
然后检查密码
if ($mysql_row["password"]==sha1($mysql_row["salt"].$_REQUEST["loginpassword"].sha1($mysql_row["salt"]))) loginsuccess = true;
现在我发现这是一种存储密码的不安全方式,因为sha1()
是废话,所以我决定使用crypt()。我没有使用password_hash()和compatibility pack,因为我有时必须将一个站点移动到另一台具有不同(有时更旧)的PHP的服务器上,并且我希望在以后的PHP版本上生成哈希/密码仍然可以使用早期PHP版本的服务器。
所以crypt()
说我可以做类似
$salt = md5(time().rand(0,9999999).rand(0,100000));
$hashed_password = crypt($_REQUEST["newpassword"],$salt);
$query = "update users set password:hashed_password where uid=:uid"; // doesn't save salt
然后检查密码:
if (crypt($_REQUEST["loginpassword"], $mysql_row["password"]) == $mysql_row["password"]) $loginsuccess = true;
所以我的问题是:
使用crypt()
时,我真的不需要将盐存储在任何地方吗?当$ something == $ somethingelse时,crypt($something,$somethingelse)==$somethingelse
总是正确吗? (现在我意识到我可以刚开始讨论这个问题)
我是否认为在较新的PHP版本上使用compatibility pack生成的哈希值可能与旧版PHP上生成的哈希值相同,因此实际上生成的密码在不同版本的PHP之间不兼容?如果是这样,为什么称它为“兼容性”包?
我意识到我可以测试大部分内容,但在安全方面,我宁愿有专家意见。
答案 0 :(得分:1)
不,它可能因服务器而异;这取决于可用的算法。 password_hash
允许您指定算法。
请参阅1. password_hash
与crypt
兼容。
您的代码还有一个问题:
你的盐生成不够随机。 rand
不是很好。 mt_rand
略胜一筹,openssl_random_pseudo_bytes
很好,推荐password_hash
(但你知道这点)。