将crypt()salt存储在数据库中进行密码比较是否安全?

时间:2013-06-10 22:59:56

标签: php encryption passwords blowfish crypt

原谅我们,我对密码安全和加密都是全新的......

我在使用php的crypt()函数(使用blowfish hasing方法)加密的存储密码与用户输入进行比较时遇到问题。我发现可以比较密码的一种方法是存储加密期间使用的盐,然后加密用户输入并将其与存储的密码进行比较。

这是一种安全的做事方式吗?或者有更好(更安全)的方式吗?

感谢。

3 个答案:

答案 0 :(得分:3)

PHP生成哈希的函数将在生成的哈希值中包含salt。因此,如果存储此哈希值,则已存储了salt。验证功能可以只提取此盐并再次使用它进行验证。这种方法是安全的,盐并不是秘密。

PHP 5.5版将内置支持BCrypt,函数password_hash()和password_verify()。实际上这些只是函数crypt()的包装器,并且使它更容易正确使用它。它负责生成安全的随机盐,并提供良好的默认值。对于PHP 5.3.7及更高版本,存在compatibility pack

使用此功能的最简单方法是:

$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

答案 1 :(得分:2)

每个用户使用一个独特的盐是一个非常好的主意。

存储用于特定用户的唯一salt以及用户的散列密码是一种非常可接受的方法,可能不会像应有的那样广泛使用。

要混淆可能直接访问数据库用户表的任何人,请考虑将salt和hash存储在数据库的同一字段中。使用不会成为salt或哈希值的一部分的字符,例如冒号(:)来分隔它们。这样可以更容易地在运行时以编程方式将它们分开。

答案 2 :(得分:1)

看一下这篇文章:https://sheriframadan.com/2013/05/password-hashing/

它包含目前被认为是密码加密的最佳做法。它涉及使用blowfish加密,每个键都有一个独特的盐。无需尝试将散列和salt存储为可解析的字符串,因为salt和has都是一个可以传入的字符串,用于比较操作。