假设有人试图通过暴力破解泄露的密码(即不使用彩虹表或常用的密码列表),以下是真的吗?
O(cracking_salted_password)> O(cracking_just_password)?
如果攻击者设法访问我的用户数据库,他们显然也会在对用户密码进行哈希处理时使用盐,即使它对每个用户来说都是完全唯一的。我想知道当有人试图通过蛮力破解盐渍密码时,时间复杂性是否也起作用。
答案 0 :(得分:4)
我想知道当有人试图通过蛮力破解盐渍密码时,时间复杂度是否起作用。
不,单个密码的时间复杂度不会因为盐而大大增加。盐确实为加密时间增加了一小部分,但不足以引起问题。
这并不意味着腌制无用。腌制有两个重要原因:
1)具有相同密码的用户看起来会有所不同。如果攻击者发现多个用户拥有相同的密码,他/她将认为密码不是随机的,并首先攻击该密码。
2)它使Rainbow Tables变得不切实际。
之前,您只需要一个查找表来进行所有密码猜测。您可以离线预先计算(甚至在某些系统之间重新使用它!)。
但是当你添加一个盐时,攻击者每个用户需要一张Rainbow表。这使得Rainbow Tables呈指数级增长,甚至可以更快地使用蛮力而不是使用Rainbow Tables!
如果您只有一个用户,那么盐可能无济于事,但随着您获得更多用户,盐是必不可少的。最好总是加盐,因为小系统经常变成大系统。
答案 1 :(得分:1)
由于salting实际上只创建了特定明文所需的一定数量的不同值(即代替密码“password”散列到值X1,例如,使用16位盐,有65536种不同的可能它可以散列到的值,盐析的效果实际上只是改变方程中的常数乘法因子。换句话说,如果您的哈希算法是O(n^2)
,那么盐化输入会使其成为k * O(n^2)
,这实际上与O(n^2)
相同。是的,匹配特定密码的哈希需要更多的时间,最多可达盐,但它确实不会改变O()
复杂性度量。复杂性度量不是关于执行某个问题需要多长时间;它是关于解决与原始问题相比大小两倍的问题需要多长时间。
答案 2 :(得分:0)
如果有一个数据库包含数十个密码作为哈希值,并且通过散列(大)一组可能的值来产生这些哈希值,那么这项工作可以一次应用于多个哈希值
但是,如果密码被腌制,那么每个密码都是唯一的,并且需要为每个密码重复工作