原谅我,我对密码安全和加密完全陌生......
我在将使用 php 的 crypt() 函数(使用河豚 hasing 方法)加密的存储密码与用户输入进行比较时遇到问题。我发现可以比较密码的一种方法是存储加密期间使用的盐,然后加密用户输入并将其与存储的密码进行比较。
这是一种安全的做事方式吗?或者有更好(更安全)的方法吗?
谢谢。
原谅我,我对密码安全和加密完全陌生......
我在将使用 php 的 crypt() 函数(使用河豚 hasing 方法)加密的存储密码与用户输入进行比较时遇到问题。我发现可以比较密码的一种方法是存储加密期间使用的盐,然后加密用户输入并将其与存储的密码进行比较。
这是一种安全的做事方式吗?或者有更好(更安全)的方法吗?
谢谢。
PHP 生成散列的函数将在生成的散列值中包含盐。所以如果你存储这个哈希值,你已经存储了盐。验证功能可以只提取此盐并再次使用它进行验证。这种方法是安全的,盐并不意味着保密。
PHP 5.5 版将内置对 BCrypt、函数password_hash()和 password_verify() 的支持。实际上,这些只是函数 crypt() 的包装,并且应该更容易正确使用它。它负责安全随机盐的生成,并提供良好的默认值。对于 PHP 5.3.7 及更高版本,存在一个兼容包。
使用此功能的最简单方法是:
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
为每个用户使用独特的盐是一个非常好的主意。
存储用于特定用户的唯一盐以及用户的散列密码是一种非常可接受的方法,可能没有像应有的那样广泛使用。
为了混淆可能直接访问数据库用户表的任何人,请考虑将盐和哈希存储在数据库的同一字段中。使用不会成为盐或哈希的一部分的字符,例如冒号 (:) 来分隔它们。这使得在运行时以编程方式将它们分开变得更容易。
看看这篇文章:https ://sheriframadan.com/2013/05/password-hashing/
它包含当前被认为是密码加密的最佳实践的内容。它涉及对每个密钥使用具有唯一盐的河豚加密。无需尝试将哈希和盐存储为可解析的字符串,因为盐和具有都是一个字符串,可以按原样传递以进行比较操作。