【问题标题】:yii CPasswordHelper: hashPassword and verifyPasswordyii CPasswordHelper: hashPassword 和 verifyPassword
【发布时间】:2013-12-22 01:08:27
【问题描述】:

我想我在这里遗漏了一些关键的东西。在CPasswordHelper::hashPassword 函数中,我们有几行:

$salt=self::generateSalt($cost);  
$hash=crypt($password,$salt);  

return $hash;

CPasswordHelper::verifyPassword 中有这样一行:

$test=crypt($password,$hash);  

return self::same($test, $hash);

盐呢?据我了解,它甚至没有被保留,但它没有任何意义,所以我猜我没有完全理解它。

【问题讨论】:

    标签: hash yii passwords salt


    【解决方案1】:

    CPasswordHelper 的工作方式类似于 PHP 的函数 password_hash()password_verify(),它们是 crypt() 函数的包装器。当您生成 BCrypt 哈希时,您将得到一个 60 个字符的字符串,其中包含盐。

    // Hash a new password for storing in the database.
    $hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
    

    变量 $hashToStoreInDb 现在将包含一个像这样的哈希值:

    $2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
     |  |  |                     |
     |  |  |                     hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
     |  |  |
     |  |  salt = nOUIs5kJ7naTuTFkBy1veu
     |  |
     |  cost-factor = 10 = 2^10 iterations
     |
     hash-algorithm = 2y = BCrypt
    

    你可以在第三个$之后找到的盐,它是由password_hash()使用操作系统的随机源自动生成的。因为盐包含在结果字符串中,函数 password_verify(),或者实际上是包装的 crypt 函数,可以从那里提取它,并且可以使用相同的盐(和相同的成本因子)计算散列。这两个哈希值是可比较的。

    // 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);
    

    【讨论】:

      【解决方案2】:

      盐被存储为哈希的一部分。

      【讨论】:

      • 你能放宽一点吗?当我将密码存储在db 中时,我用盐对文本密码进行加密并获得某种哈希值。现在,当我想验证用户输入的密码是否合法时,我不需要用相同的盐对其进行加密吗?如果我用哈希加密它,我不会得到别的东西吗?
      • 正如@martinstoeckli 已经指出的那样,CPasswordHelper 生成的散列包含一个 $ 符号,后跟所选算法的代码,另一个 $,成本因素(注意:如果您看到一个 10,它实际上意味着 2^10 次迭代!),另一个 $,固定数量的字符是盐,后面紧跟实际的哈希。
      猜你喜欢
      • 2015-07-18
      • 2014-02-27
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2020-11-29
      • 2015-01-07
      • 1970-01-01
      • 2014-08-23
      相关资源
      最近更新 更多