关于php:bcrypt salt获取密码和费用

bcrypt salt for a password and cost

我刚读到关于Bcrypt的文章,它有多好。据我所知,我使用盐和其他方法,如MD5、SHA1、SHA2等,以防止彩虹攻击。Bcrypt需要一种盐来说明成本。

根据这一点,我有几个问题:

  • 我需要在数据库中为每个密码存储一个salt吗?或者我可以对每个密码使用相同的salt?

  • 成本是如何计算的?成本15和成本20有什么不同?我知道它与迭代有关,但是它在每次迭代中究竟做了什么?


  • php的文档对表达式"salt"有点误导,实际上crypt()函数需要散列参数,salt只是这个参数的一部分。

    好的是,所有参数都将包含在生成的60个字符的哈希字符串中,因此您不需要单独存储它们,只需存储字符串就可以了。将成本系数提高到2的幂,即将成本系数增加1,将使计算时间加倍。

    PHP现在有了一个函数password_hash(),它可以为您处理所有困难的部分。使用这个函数而不是crypt,它将生成一个安全的随机salt。

    1
    2
    3
    4
    5
    6
    7
    // 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);

    我写了一个关于这个主题的教程,如果你感兴趣,可以看看这里。