即使我选择 1 个字符作为密码或 32 个包含数字、字母、大写符号等的字符,bcrypted 密码仍然是 60 个字符长度的密码。那么使用 bcrypt 时密码强度是否重要?
bcrypt中密码的强度是否重要?
密码的“强度”正是攻击者不知道的程度。它总是很重要。该强度等于攻击者为了猜测它而必须执行的尝试次数(平均)。
bcrypt 所做的是它使每次尝试都变得更加昂贵。凭借其可配置的迭代次数,设置得足够高,bcrypt 可以使攻击者在他的机器上每秒无法尝试超过一个密码。这(对您而言)比每秒十亿次尝试要好得多,但哈希函数不太合适:它使破解密码的难度增加了十亿倍。但是,如果您的密码仅包含一个字符,攻击者仍然会在不到一分钟的时间内找到它。
因此,虽然 bcrypt 让弱密码更容易被容忍,但它并不能绝对拯救你的皮肤。
(bcrypt 的输出长度与此无关。散列函数具有固定的输出大小是正常的;事实上,如果输出大小取决于输入大小,那么这将是一个弱点,因为它会泄露密码信息。 )
您的密码强度与 bcrypt 哈希恰好是 60 个字符长有什么关系?
如果您的密码很容易猜到,那么无论生成的哈希可能有多长,猜测都是微不足道的。如果您谈论的是单个可打印的 ASCII 字符,那么攻击者最多需要 95 次尝试才能找出密码。没有哈希算法可以阻止这种情况。
bcrypt 不会神奇地使每个密码都免受暴力攻击。这只会使那些攻击更加困难。弱密码不会从中受益。但是如果你有一个不错的密码,那么 bcrypt 可以通过要求比攻击者更多的资源来使暴力攻击变得不可行。
强密码总是很重要,因为有两个概念使破解密码更容易:字典攻击和彩虹攻击(通常一起使用以获得最大效率)。对于字典攻击,人们只需获取字典中的每个单词(通常是两个、三个和四个单词等),然后首先尝试这些组合。鉴于字典的大小相当小,拥有与字典中的单词匹配的密码使得查找密码变得微不足道。这就是为什么您不应该使用常用名称、单词或短语作为密码的原因。
彩虹攻击通过预先计算值(例如,来自字典攻击)甚至数百万个可能的随机字符密码,为攻击者提供了更多的火力。由于它们是预先计算的,攻击者只需扫描他们的表以查找您的哈希,如果匹配,他们会立即知道您的密码。虽然这在本质上类似于蛮力攻击,但这里的决定因素是攻击者攻击您的数据,这些数据已经拥有数百万甚至数十亿的哈希值,可以在几秒钟内进行扫描以进行匹配。即使攻击者花了一百万秒来猜测密码,他们甚至在找到您的文件之前就已经花费了那段时间。为实际攻击做准备可以大大减少查找密码所需的时间。即使他们没有找到它,他们'
因此,尽管安全密码仍然存在巨大空间(远远超过不安全密码),但必须注意避免最有可能出现在字典攻击或彩虹攻击中的密码。选择字母、数字和符号的组合很重要,但不能采用常见的模式。例如,“h4ck3rz”可能看起来有些安全,但由于这是一个常见的“leet-speek”术语,您应该避免将其用作密码或其一部分。此外,任何少于八个字母的密码都很容易破解,也应该避免使用。
隐含的问题是:包含数字、字母、大写符号等的 32 个字符的密码有意义吗?
我会说在密钥派生函数中与 Bcrypt 一起使用时这是一种矫枉过正的做法,但是在这样的长度下,可以选择使用密码短语。后者可能由现有的单词组成,例如:
满足低乌木对齐扫描(为可读性添加了空格)
这些词可以从一个相当小的字典中选择,比如一个 7776 词的 Diceware 类字典。必须随机选择单个单词!(对于密码的单个字符也是如此。)
在http://en.wikipedia.org/wiki/Password_strength 可以看到,一个 5 字的 Diceware 短语与由 a..z A..Z 0..9 组成的 11 个字符的密码一样强。如果你想做数学:
11 个字符的密码:11^62(可能性)= 5.23E19 种组合
一个五个单词的短语组成一个 7776 个单词词典:7776^5=2.8E19 个组合
不会做数学:像 cater=low=ebOony=align=scan 这样的短语:1.3E22 组合(包括分隔符 + 仅一个随机插入字符)