使用crypt()时在数据库中生成和存储salt

时间:2014-04-24 22:50:44

标签: php mysql cryptography

我以前做的事情:

$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;

所以我的问题是:

  1. 使用crypt()时,我真的不需要将盐存储在任何地方吗?当$ something == $ somethingelse时,crypt($something,$somethingelse)==$somethingelse总是正确吗? (现在我意识到我可以刚开始讨论这个问题)

  2. 我是否认为在较新的PHP版本上使用compatibility pack生成的哈希值可能与旧版PHP上生成的哈希值相同,因此实际上生成的密码在不同版本的PHP之间不兼容?如果是这样,为什么称它为“兼容性”包?

  3. 我意识到我可以测试大部分内容,但在安全方面,我宁愿有专家意见。

1 个答案:

答案 0 :(得分:1)

  1. 不,它可能因服务器而异;这取决于可用的算法。 password_hash允许您指定算法。

  2. 请参阅1. password_hashcrypt兼容。


  3. 您的代码还有一个问题:

    你的盐生成不够随机。 rand不是很好。 mt_rand略胜一筹,openssl_random_pseudo_bytes很好,推荐password_hash(但你知道这点)。