猿问

如何使用密码散列

如何使用密码散列

最近,我一直试图在网上偶然发现的登录脚本上实现自己的安全性。在努力学习如何让自己的脚本为每个用户生成一个SALT之后,我无意中发现了Password_Hash。

根据我所理解的(基于本页的阅读):http://php.net/manual/en/faq.passwords.php),当使用Password_Hash时,已在行中生成SALT。这是真的吗?

我的另一个问题是,吃两种盐不是很明智吗?一个直接在文件里,一个在数据库里?这样的话,如果有人在DB中妥协了您的盐分,那么您仍然可以直接在文件中找到盐吗?我在这里读到,储存盐从来不是一个聪明的想法,但它总是混淆了人们的意思。


米脂
浏览 525回答 3
3回答

慕田峪7331174

使用password_hash是存储密码的推荐方法。不要将它们与DB和文件分开。假设我们有以下输入:$password = $_POST['password'];我并不仅仅为了理解这个概念而验证输入。首先通过以下操作散列密码:$hashed_password = password_hash($password, PASSWORD_DEFAULT);然后查看输出:var_dump($hashed_password);你可以看到它是散列的。(我想是你做的)。现在,您将这个散列密码存储在数据库中,然后假设用户要求将它们登录。通过执行以下操作,可以在数据库中使用此哈希值检查密码输入:// Query the database for username and password// ...if(password_verify($password, $hashed_password)) {     // If the password inputs matched the hashed password in the database     // Do something, you know... log them in.} // Else, Redirect them back to the login page.正式参考

烙印99

是的,正确理解它,函数Password_Hash()将自动生成一个盐类,并将其包含在结果的散列值中。将盐分存储在数据库中是绝对正确的,即使已知它也能完成它的工作。// Hash a new password for storing in the database.// The function automatically generates a cryptographically safe salt. $hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT); // Check if the hash of the entered login password, matches the stored hash. // The salt and the cost factor will be extracted from $existingHashFromDb.$isPasswordCorrect = password_verify ($_POST['password'], $existingHashFromDb);您提到的第二个盐(存储在文件中的盐)实际上是胡椒键或服务器端密钥。如果你在加入之前(如盐),然后你加入胡椒。不过,有一种更好的方法,您可以先计算哈希,然后用服务器端密钥加密(双向)哈希。这使您有可能在必要时更改密钥。与盐相反,这把钥匙应该保密。人们常常把盐混在一起,试图把盐藏起来,但最好让盐做好它的工作,用一把钥匙把秘密加进去。

小怪兽爱吃肉

是的,这是真的。为什么怀疑函数上的php FAQ?:)运行结果password_hash()分四部分:使用的算法参数食盐实际密码散列所以正如你所看到的,散列是它的一部分。当然,您可以使用额外的盐来增加一层安全性,但老实说,我认为这在常规的php应用程序中是过分的。默认的bcrypt算法是好的,可选的河豚算法可以说更好。
随时随地看视频慕课网APP
我要回答