为什么密码哈希对于具有相同密码的2个用户是不同的?

vis*_*swa 8 bcrypt ruby-on-rails-3.1

我正在使用rails,我注意到我的password_digest对于2个用户而言是不同的,除了密码摘要之外的所有其他字段都不同.但我使用相同的密码"abcd"两个..
它最终生成这两个不同的哈希

  1. $2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO
  2. $2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem

我以为bcrypt gem只根据密码字段生成哈希!我错了吗?谢谢 :)

Rya*_*yan 19

你在这里看到的不仅仅是密码哈希,还有很多关于这些字符串中包含的哈希的元数据.就bcrypt而言,整个字符串将被视为bcrypt哈希.这是它包括的内容:

$是bcrypt中的分隔符.

$ 2a $是使用的bcrypt算法.

$ 10 $是使用的成本因素.这就是为什么bcrypt非常适合存储哈希的原因.每个哈希都有与之相关的复杂性/成本,您可以将其视为计算机生成此哈希的速度.这个数字当然与计算机的速度有关,因此随着计算机越来越快,多年来生成一个成本为10的哈希所需的时间越来越少.因此,明年你将成本增加到11,那么到12 ...... 13 ......等等.这样可以使您的未来哈希值保持强劲,同时保持旧哈希值仍然有效.请注意,如果不重新散列原始字符串,则无法更改散列的开销.

$ QyrjMQf ...是salt和hash的组合.这是base64编码的字符串.

前22个字符是盐.

剩下的字符是与2a算法一起使用时的散列,成本为10,以及给定的盐.盐的原因是攻击者不能预先计算bcrypt哈希值以避免支付生成它们的成本.

事实上,这是你原来问题的答案:哈希的不同之处在于,如果它们是相同的,你就会知道,只要你看到bcrypt字符串,$2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO你就会知道密码abcd.因此,您只需扫描哈希数据库,并通过查找该哈希快速查找具有abcd密码的所有用户.

你不能用bcrypt这样做,因为$2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem也是abcd.而且还有许多更多的哈希将成为结果bcrypt('abcd').这使得扫描数据库的abcd密码几乎不可能.