【问题标题】:Are there any reasons not to use PHP's default password hashing library?有什么理由不使用 PHP 的默认密码散列库吗?
【发布时间】:2017-05-20 08:15:05
【问题描述】:

我是一个相当新的开发人员,我想确保我在安全方面做出正确的决定。根据我的研究,看来我应该对我的密码使用加盐 bcrypt 散列算法。根据 PHP 7 的文档,password_hash 功能正是这样做的。我什至不必想办法自己制作盐,因为加盐包含在 password_hash 中。这似乎是 PHP 7 密码散列的简单正确答案。但是,简单的正确答案通常是错误的。 PHP默认密码哈希库有哪些坑?

关于 PHP 密码散列的大多数答案都认为我应该使用 password_hash/password_verify。但是,我的问题更接近于“我应该如何使用它们?”或“使用它们时我应该注意什么?”

【问题讨论】:

  • 那里的答案归结为“使用密码哈希/密码验证”我的问题不是是否使用它们,而是我在使用它们时应该注意什么。
  • 好吧,回答:与crypt 函数和brcypt 算法相比,没有缺陷。长答案:见Secure hash and salt for PHP passwords问题的答案(上面的链接)

标签: php hash passwords


【解决方案1】:

似乎您正在寻找确认,所以是的,password_hash() 函数绝对是要走的路,您无法通过正常的 PHP 安装做得更好。这个函数是面向未来的,可以在必要时更改算法,同时保持与现有哈希的向后兼容性。

你应该做的是:

  1. 使用带有参数PASSWORD_DEFAULT的函数,这允许将来切换算法。看看下面的例子。
  2. 将哈希值存储在 varchar(255) 类型的数据库字段中,以便将来的算法也可以存储它们的哈希值。
  3. 确保您使用的是 PHP 5.3.7 或更高版本,以便该函数生成标识符为 $2y$(而不是 $2a$)的哈希。

例子:

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($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($password, $existingHashFromDb);

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 2017-01-11
    • 2019-09-11
    • 2021-08-02
    • 1970-01-01
    • 2017-10-04
    • 2012-08-24
    • 2015-08-13
    相关资源
    最近更新 更多