根据我对密钥派生函数(KDF)的理解,例如scrypt、Argon2等,我们可以调整它们的参数,从而最终使攻击者更难强行强制密码到密钥。在这一点上,攻击者可以直接蛮力,如AES128,密钥。
最好不要过度调整KDF的参数,这样用户就不会在使用缓慢的应用程序时感到不必要的痛苦。我认为,如果只对KDF进行调优,使用户在使用AES128-CBC (或任何其他对称密码)时仍能最大限度地安全,这是非常理想的。
一个简单的方法是探索硬件和算法设计上的所有改进,以便估计某些资金充足的机构需要等待多长时间才能最终解密我的密码。但是,我认为这种方法是不必要的复杂,因为我认为我们可以通过从信息论的角度来研究KDF的计算界。
下面是一次尝试。我的问题是:我们能让它更紧吗?
假设f
是一个128位的加密/解密函数,而KDF函数是k
。另外,假设一轮k
等于f
对单个块的加密/解密。假设我们的密码只有熵的70
位。
所以强暴所有密钥的总尝试是2^{128}
,而强暴密码的总尝试是2^{70}
。由于f
和k
计算成本相等,所以强制密钥的实际成本是c \times 2^{128}
,而密码是c \times 2^{70}
。在这种情况下,对手显然会采取暴力强制密码。
为了使攻击者找不到更容易破解的密码,我们可以多次为r
重复KDF D15
,直到困难匹配为止。基本上:\begin{split} c2^{128} &= rc2^{70} \\ 2^{128} &= r2^{70} \\ \frac{2^{128}}{2^{70}} &= r \\ 2^{128-70} &= r \\ 2^{58} &= r \\ \end{split}
如果KDF k
本身是通过递归调用k
来实现的,那么这个c
就可以得到保证,并且只需递归地重复足够长的时间,就可以保证通过KDF k
强制口令的难度与具有128
熵比特的强制密钥一样困难。
这意味着,如果是r > 2^{58}
,那么攻击者会发现更容易直接强暴密钥。在这种情况下,攻击者会完全忽略KDF k
,转而使用f
的S键,换句话说,r>2^{58}
是毫无意义的。
更新:上述内容也是作为白雪的一部分实现的。
发布于 2020-11-14 20:23:30
通常,当攻击者试图猜测密码时,我们通过查看添加到密码搜索中的order O
来查看其强度。这与迭代次数基本相同,假设有salt和正确的密码哈希。通常,只使用位比较简单,这基本上是顺序的\log_2
。
因此,如果密码强度是关于40位的平均值,那么您将获得迭代次数的log_2
,并简单地将值相加以获得结果的强度。因此,经过1048576次迭代,我们就可以绕过40 + \log_2(1,048,576) = 40 + 20 = 60
的强度。Given密码的平均弱点,没有更高的限制,这是不完全不切实际的。显然执行2^{88}
操作,以允许即使平均密码具有128位安全性是不可能的。因此,一般情况下,您应该以特定服务的最高价值为目标。
出于同样的原因,采取其他措施是非常重要的,而不仅仅是使用具有较大迭代次数的密码散列。可能的措施是最大重试次数,在测试每个密码之前增加延迟,需要(可能)高熵的好密码,或者使用某种密码管理器。现在浏览器提供内部密码管理器,包括生成密码,这是有充分理由的。
请注意,一些密码哈希(例如bcrypt )使用两个指数的“工作因子”,而不是迭代计数,以便更好地了解以位为单位增加的密码熵的强度。
https://crypto.stackexchange.com/questions/85676
复制相似问题