2014-12-19 64 views
0

如果crypt()每次都会生成一个不同的字符串,那么我应该如何在数据库中将提供的密码和salt组合为相同的加密密码?如何用crypt()和我的盐生成相同的加密数据库密码字符串值?

我在想,我可以为crypt()方法生成一个随机salt,以便与用户提供的输入(id est crypt(@_POST['password'],$salt))相结合来加密密码。这为我的数据库生成一个加密的密码。我还将$salt存储在我的数据库中的salt列中。

我以为我可以打电话给crypt($_POST['providedPassword'],$saltStoredInDatabaseFromRegistrationTime)为我存储在从登记表数据库的密码返回相同的加密值,但事实证明,crypt()正在恢复我每次调用它不同的值。

我该如何结束与我在我的数据库中的密码相同的加密值?

+2

你有PHP 5.5吗?改为使用'password_hash()';否则,请使用[password_compat](https://github.com/ircmaxell/password_compat) – 2014-12-19 01:58:17

+2

这并不重要。生成的哈希值可能不同,但最终结果总是相同的字符串。为什么不使用['password_hash()'](http://www.php.net/manual/en/function.password-hash.php)并让它为你处理所有事情,而不是存储单独的盐?如果小于5.5,请使用['password_hash()兼容包]](https://github.com/ircmaxell/password_compat)。 – 2014-12-19 01:59:46

+0

@ Fred-ii-我也将salt存储在数据库中,因为我读过很多地方,如果我使用这个方法,有权访问salt的黑客可能会违反数据库中的所有密码每个密码都相同的盐。通过提取salt并将其与每个密码相结合来确保这种额外的安全性并没有那么麻烦。我错了吗? – IIllIIll 2014-12-19 02:04:32

回答

2

的方式crypt()作品是这样的:

// to create 
$hash = crypt($password, $salt); 

// to verify 
if (crypt($password, $hash) == $hash) { 
    // yay! 
} 

不完全一样; crypt()有各种散列算法,它可以返回无效散列来指示错误。最后,你应该比较使用比较函数,这不是容易计时攻击,散列如新hash_equals()

注:总是生成每次哈希与crypt()什么时候一个新的盐,这是对重要。

也就是说,从PHP 5.5开始,你应该使用password_hash()password_verify()来散列密码;对于早期版本,您可以使用password_compat库。

+0

*适用于早期版本... * - PHP> = 5。3.7 – 2014-12-19 02:04:37

相关问题