【发布时间】:2014-02-28 01:18:08
【问题描述】:
我刚刚阅读了有关 bcrypt 的内容以及它的真正优势。据我了解,我使用盐和其他方法(如 MD5、SHA1、SHA2 等)来防止彩虹攻击。 bcrypt 需要一种盐来告诉它成本。
据此我有几个问题:
我需要在我的数据库中为每个密码存储一个盐吗?或者我可以为每个密码使用相同的盐?
成本如何运作?成本 15 和成本 20 有什么区别?我知道它与迭代有关,但每次迭代它到底做了什么?
【问题讨论】:
我刚刚阅读了有关 bcrypt 的内容以及它的真正优势。据我了解,我使用盐和其他方法(如 MD5、SHA1、SHA2 等)来防止彩虹攻击。 bcrypt 需要一种盐来告诉它成本。
据此我有几个问题:
我需要在我的数据库中为每个密码存储一个盐吗?或者我可以为每个密码使用相同的盐?
成本如何运作?成本 15 和成本 20 有什么区别?我知道它与迭代有关,但每次迭代它到底做了什么?
【问题讨论】:
PHP 的文档对“salt”这个表述有点误导,实际上crypt() 函数需要散列参数,而salt 只是这个参数的一部分。
好消息是,所有参数都将包含在生成的 60 个字符的哈希字符串中,因此您不需要单独存储它们,只需存储字符串就可以了。成本因子提高到 2 次方,也就是说,成本因子每增加 1 倍,计算时间就会增加一倍。
PHP 现在有一个函数password_hash() 为您处理所有困难的部分。使用这个函数代替 crypt,它会生成一个安全的随机盐。
// 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);
我写了一篇关于这个主题的教程,如果你有兴趣可以看看here。
【讨论】: