密码长度/复杂性只能减轻暴力攻击,对吗?如果发生散列泄漏,由于任何算法都是固定长度的,因此可能存在具有非常短/不复杂字符串的原像*?尽管加盐。
如果散列被泄露,密码长度/复杂性有什么不同吗?
假设您在海滩上有十几个人。你让每个人轮流随机挑选一粒沙子,不看它,在上面写上他们的名字,然后把它随机扔回沙滩上。
两个人在同一粒沙子上写名字的几率有多大?
根据维基百科,人工生成密码的密钥空间大小约为 40 位。大多数现代密码散列的密钥空间是 128 或 256 位。
这两组的大小差异如此之大,绝大多数可能的哈希值都无法从典型的密码中获得。发生碰撞的可能性就像两个人在海滩上采摘同一粒沙子。
要达到冲突,您通常必须遍历一半的散列键空间。在这样做时,您必须生成一个可能更长的密码,并且远不像人类选择的单词,这样实际的原始密码会更容易猜到。
可能与非常短/不复杂的字符串发生冲突
这是真的。
您的密码可能恰好与使用的特定哈希函数和盐下的更短的字符串发生冲突。但是“可能”不同于“可能”;加密安全证明依赖于“可能”的非常严格的定义。
(更新)正如@lynks 在他们的回答中指出的那样,在第一次尝试时正确猜测密码的暴力破解者在天文数字上比在哈希冲突中绊倒更有可能,更不用说另一个值超短的冲突了。
平均而言(即不包括运气、上帝的干预等),攻击者将需要遍历某种非常大的密码字典。
如果发生散列泄漏,由于任何算法都是固定长度的,因此可能会与非常短/不复杂的字符串发生冲突?
就密码学而言,冲突不是正确的术语。在散列项中,冲突项用于查找两个不同的输入x
,y
因此hash(x) = hash(y)
. 在这种情况下,攻击者可以自由选择两个输入。因此,这不是你的情况。由于生日攻击,碰撞攻击的成本为 O(2 n/2n
),比特输出大小的哈希函数的概率为 50% 。
正确的术语是为给定的哈希值找到一个原像 ,这样. 由于鸽巢原理,我们应该小心使用前映像,正如您所指出的,我们希望任何散列值都有多个输入值。找到它们中的任何一个就足够了,因为它们都具有相同的哈希值。对于输出大小为 的散列函数,查找原像的一般成本为 O(2 n ) 。通常的原像搜索是使用随机输入执行的。x
h
hash(x) == h
n
n
在您的情况下,密码很短,然后您陷入哈希函数的输入空间短问题。在这种情况下,直接搜索输入空间将找到确切的原像。
原像可以很容易地并行化。如果不使用盐,那么短密码很容易成为 Rainbow 表的目标。即使使用了盐,非常短的密码也很容易成为大型机构的目标。
密码长度/复杂性只能减轻暴力攻击,对吗?
不完全是。部署的密码散列算法也很重要。例如,如果您使用迭代 100K 的 PBKDF2,那么您会减慢攻击时间。如果你使用 Argon2,那么你有更多的参数来减慢攻击时间,比如高内存需求(内存硬)、并行性和迭代。
内存硬度是为了防止大量的 ASIC/GPU 搜索,并行性是关于多线程的。有了这些,您可以降低攻击者的力量,甚至可以估计他们的时机。
如果我们假设比特币矿工的集体力量是最大的计算实体,我们就可以开始量化了。他们可以在一年内计算出大约2^93
SHA256 哈希值。如果您使用 100K 迭代,那么它们可以2^76
在一年内达到最多。如果你开始考虑他们中的大多数使用 ASIC 和 GPU,那么 Argon2 几乎将毫无用处。GPU/CPU 时序可以在hashcat站点中找到,也可以直接搜索hashcat PBKDF2 GTX 3080
,(示例)。
如果散列被泄露,密码长度/复杂性有什么不同吗?
因此,确切的答案可以通过密码长度和复杂性以及部署的密码散列机制给出。
如果密码真的很短而且不复杂,那么它可能在 pwned 密码列表中,当前包含大约613M pwned 密码。用一个好的数据库进行测试只是时间问题。如果不在列表中,则只是另一个搜索。单个 GTX 3080 GPU 可以在 18 小时内达到 2^48 SHA-512。真正的指标需要密码哈希算法和密码长度/复杂度。
忘记旧的密码方法,使用基于单词的方法,如dicewire或Bip39。更好的选择是使用keepass或1password之类的密码管理器,或者……在这种情况下,您只需要一个强度高的密码来锁定和解锁密码管理器,其余的由管理器处理。
密码长度/复杂性只能减轻暴力攻击,对吗?
是的,非常多(它还有助于防止突变字典攻击,例如如果它尝试“horse1”-“horse999”但您的密码是“horse0999”,那么额外的密码复杂性会破坏特定的突变)
如果发生散列泄漏,由于任何算法都是固定长度的,因此可能会与非常短/不复杂的字符串发生冲突?
不超出生日悖论,这对于密码散列级散列实际上不是问题。