84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
最近我一直在尝试在我在互联网上找到的登录脚本上实现自己的安全性。在努力学习如何为每个用户生成盐的过程中,我偶然发现了password_hash。
password_hash
据我所了解(根据这个页面上的阅读),在使用password_hash时,盐已经在行中生成。这是真的吗?
我还有一个问题,是否明智地使用两个盐?一个直接在文件中,一个在数据库中?这样,如果有人破解了数据库中的盐,你仍然有文件中的那个盐。我在这里读到过存储盐从来都不是一个明智的想法,但是我一直对人们所说的这个意思感到困惑。
是的,你理解得没错,函数password_hash()会自动生成一个盐,并将其包含在生成的哈希值中。将盐存储在数据库中是完全正确的,即使已知也能发挥作用。
// 为在数据库中存储的新密码生成哈希值。 // 该函数会自动生成一个密码学安全的盐。 $hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT); // 检查输入的登录密码的哈希值是否与存储的哈希值匹配。 // 盐和成本因素将从$existingHashFromDb中提取。 $isPasswordCorrect = password_verify($_POST['password'], $existingHashFromDb);
你提到的第二个盐(存储在文件中的盐)实际上是一种“胡椒粉”或服务器端密钥。如果在哈希之前添加它(就像盐一样),那么你就添加了一种胡椒粉。不过,有一种更好的方法,你可以先计算哈希值,然后使用服务器端密钥加密(双向加密)哈希值。这样你就可以在必要时更改密钥。
与盐不同,这个密钥应该保密。人们经常混淆并试图隐藏盐,但最好让盐发挥作用,并使用密钥添加秘密。
使用password_hash是存储密码的推荐方式。不要将它们分开存储到数据库和文件中。
假设我们有以下输入:
$password = $_POST['password'];
首先通过以下方式对密码进行哈希处理:
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
然后查看输出结果:
var_dump($hashed_password);
可以看到它已经被哈希处理了(我假设你已经完成了这些步骤)。
现在将这个哈希密码存储到数据库中,确保你的密码列足够大以容纳哈希值(至少60个字符或更长)。当用户要求登录时,你可以通过以下方式检查数据库中的哈希值与密码输入是否匹配:
// 查询数据库以获取用户名和密码 // ... if(password_verify($password, $hashed_password)) { // 如果密码输入与数据库中的哈希密码匹配 // 做一些操作,你懂的...登录他们。 } // 否则,将他们重定向回登录页面。
官方参考
是的,你理解得没错,函数password_hash()会自动生成一个盐,并将其包含在生成的哈希值中。将盐存储在数据库中是完全正确的,即使已知也能发挥作用。
你提到的第二个盐(存储在文件中的盐)实际上是一种“胡椒粉”或服务器端密钥。如果在哈希之前添加它(就像盐一样),那么你就添加了一种胡椒粉。不过,有一种更好的方法,你可以先计算哈希值,然后使用服务器端密钥加密(双向加密)哈希值。这样你就可以在必要时更改密钥。
与盐不同,这个密钥应该保密。人们经常混淆并试图隐藏盐,但最好让盐发挥作用,并使用密钥添加秘密。
使用
password_hash
是存储密码的推荐方式。不要将它们分开存储到数据库和文件中。假设我们有以下输入:
首先通过以下方式对密码进行哈希处理:
然后查看输出结果:
可以看到它已经被哈希处理了(我假设你已经完成了这些步骤)。
现在将这个哈希密码存储到数据库中,确保你的密码列足够大以容纳哈希值(至少60个字符或更长)。当用户要求登录时,你可以通过以下方式检查数据库中的哈希值与密码输入是否匹配:
官方参考