首页  >  问答  >  正文

如何使用PHP的password_hash函数对密码进行哈希和验证

<p>最近我一直在尝试在我在互联网上找到的一个登录脚本上实现自己的安全性。在努力学习如何为每个用户生成盐的脚本时,我偶然发现了<code>password_hash</code>。</p> <p>根据我理解(基于这个页面上的阅读),当你使用<code>password_hash</code>时,盐已经在行中生成了。这是真的吗?</p> <p>我还有一个问题,是否明智地使用两个盐?一个直接存在文件中,一个存在数据库中?这样,如果有人破坏了数据库中的盐,你仍然有文件中的一个盐。我在这里读到过,存储盐从来都不是一个明智的做法,但是人们说这个总是让我感到困惑。</p>
P粉011684326P粉011684326399 天前541

全部回复(2)我来回复

  • P粉896751037

    P粉8967510372023-08-18 17:37:32

    是的,你理解得没错,函数password_hash()会自动生成一个盐,并将其包含在生成的哈希值中。将盐存储在数据库中是完全正确的,即使已知,它也能发挥作用。

    // 为在数据库中存储的新密码生成哈希值。
    // 该函数会自动生成一个密码学安全的盐。
    $hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT);
    
    // 检查输入的登录密码的哈希值是否与存储的哈希值匹配。
    // 盐和成本因素将从$existingHashFromDb中提取。
    $isPasswordCorrect = password_verify($_POST['password'], $existingHashFromDb);

    你提到的第二个盐(存储在文件中的盐),实际上是一个辣椒或服务器端密钥。如果在哈希之前添加它(就像盐一样),那么你就添加了一个辣椒。不过有一种更好的方法,你可以先计算哈希值,然后使用服务器端密钥对哈希值进行加密(双向加密)。这样你就可以在必要时更改密钥。

    与盐不同,这个密钥应该保密。人们经常混淆并试图隐藏盐,但最好让盐发挥作用,并使用密钥添加秘密。

    回复
    0
  • P粉422227023

    P粉4222270232023-08-18 10:36:51

    使用password_hash是存储密码的推荐方式。不要将它们分开存储在数据库和文件中。

    假设我们有以下输入:

    $password = $_POST['password'];

    首先通过以下方式对密码进行哈希处理:

    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    然后查看输出结果:

    var_dump($hashed_password);

    如你所见,它已经被哈希处理了。(我假设你已经完成了这些步骤)。

    现在将这个哈希密码存储在你的数据库中,确保你的密码列足够大以容纳哈希值(至少60个字符或更长)。当用户请求登录时,你可以通过以下方式检查数据库中的哈希值与密码输入是否匹配:

    // 查询数据库获取用户名和密码
    // ...
    
    if(password_verify($password, $hashed_password)) {
        // 如果密码输入与数据库中的哈希密码匹配
        // 做一些操作,你懂的... 登录他们。
    } 
    
    // 否则,将他们重定向回登录页面。

    官方参考文档

    回复
    0
  • 取消回复