【问题标题】:Password hash flow - especially reset password密码哈希流 - 尤其是重置密码
【发布时间】:2014-07-29 07:15:45
【问题描述】:

我正在更新我在我的网站上存储密码的方式,并希望分享我的流程想法以确保我做对了:

首先,用户将选择一个密码,我将对其进行哈希处理:

function generateHash($password) {
    if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
        $salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);
        return crypt($password, $salt);
    }
}

$passToStore = generateHash($userPassword);

然后我将把它存储在一个纯粹用于密码的表中,并以用户表中自动生成的userId 作为键:

userId INT
hashedPassword VARCHAR(22)
forgottenHash VARCHAR(36)

当用户返回并尝试登录时,我将从他们输入的电子邮件(用户名)中提取加入选择查询中的密码。然后检查是否匹配他们输入的内容:

function verify($passwordEntered, $hashedPasswordStored) {
    return crypt($passwordEntered, $hashedPasswordStored) == $hashedPassword;
}

如果用户忘记了密码,他们输入他们的电子邮件地址,我将生成一个随机散列并使其唯一,添加 strtotime 当前时间/日期(进入 forgottenHash),然后将链接发送给他们用他们的电子邮件和随机散列作为键并在 URL 中单击。

如果他们点击链接并且哈希值与该电子邮件地址的用户匹配,我将删除存储的哈希密码并让他们创建一个新密码。我担心重置密码的思考过程,但这对我来说似乎是正确的。但我不是黑客。

这是管理密码的好方法还是有更好的方法?

【问题讨论】:

  • rand() 不适合加密随机性。
  • 为什么不用password_hash()和password_verify()?
  • 我建议不要直接使用 hash() 或 crypt(),而是使用 PHP 5.5 的 built-in password functions,旧版本可以通过一个文件下载。
  • @IMSoP 甚至都不知道它的存在。节省大量工作,非常感谢您指出。
  • 另见 Openwall 的 PHP password hashing framework (PHPass)。它的便携性和强化了对用户密码的一些常见攻击。

标签: php password-encryption


【解决方案1】:

正如其他人在 cmets 中已经提到的那样,有一些函数可以进行散列。它们还会为您生成安全的盐:

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// 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($password, $existingHashFromDb);

忘记密码功能应该按照您的建议进行一些不同的操作。虽然密码哈希通常存储在“用户”表中,但您应该为密码重置创建一个单独的表。当用户请求时,您生成一个不是从其他用户数据派生的 random 令牌,并将它的 hash 与用户 ID 一起存储在新表中。您发送给用户的令牌本身。如果用户点击了带有token的链接,那么你可以再次计算这个token的hash并在表中搜索它,如果匹配则允许用户更改密码。

【讨论】:

  • 这是要走的路。如果您使用的是 PHP this compatibility library,它为 PHP 版本
猜你喜欢
  • 1970-01-01
  • 2018-02-27
  • 2023-04-08
  • 2012-07-07
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
相关资源
最近更新 更多