裁剪散列应该意味着丢失它所代表的一些数据,所以我想知道裁剪的散列是否更难破解,更具体地说,如果存储用于用户身份验证的裁剪密码哈希是一个值得研究的想法。
答案 0 :(得分:7)
将这个想法发挥到极致:假设您只存储散列密码的第一个十六进制字符。
所有您的用户密码将散列为16个值中的一个:
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
我承认John The Ripper很难对这些密码进行强制解码,但还让别人在平均大约8次尝试中猜出其他用户的密码
糟糕!
如果有的话,你应该存储更长的哈希值。而是Salt well。
答案 1 :(得分:5)
我在上述评论中发布的内容的快速摘要:
裁剪哈希将导致更大的冲突可能性。当两个值导致相同的散列时发生冲突。良好的散列函数通常具有非常低的冲突率,但是当您从生成的散列中删除字符时,您逐渐增加了删除使该散列与另一散列区别的内容的机会。
换句话说:不,裁剪的哈希不会更安全,实际上安全性会大大降低。唯一的价值就是让“解决”你的哈希的攻击者在另一个系统上使用结果稍微困难一些。但是,他们可以在您的系统上正常使用结果。
另一方面,对你的哈希进行盐化使得它不易受到彩虹表和其他强力解码方法的影响,同时仍能将碰撞保持在最低限度。此外,应该注意的是,当您查看将哈希裁剪为密码保护功能时,您实际上是在发生冲突。我认为你考虑这个问题的唯一原因是你不希望攻击者能够在另一个网站上使用别人的密码,因为显然你不会自己受益。删除的位数越少,冲突集越小,因此攻击者仍然可以恢复(或至少猜测)原始密码的可能性越高。
例如:
如果攻击者发现a6shp
和ghsa2
以及apple
都减少到相同的裁剪哈希,则1)他们将能够登录您的系统他们遇到第一个工作结果的那一刻,还有2)他们会非常清楚哪个结果实际上是密码。如果裁掉如此多的数据,数以万计的组合将匹配,那么它就会变得更难(但那么多更难)但是现在你自己系统的安全性大大降低了。这种情况一直持续到冲突数接近无穷大为止。
答案 2 :(得分:4)
裁剪你的哈希是一个非常糟糕的想法。
考虑以下两个密码:
password1
password2
使用以下哈希值:
732654732854235
732654732837454
现在让我们把那些哈希说成10个字符。现在我们得到:
7326547328
7326547328
哇太糟糕了。
现在我可以使用password1或password2登录。
如果您担心恶意用户使用您的密码获取数据库,请确保:
答案 3 :(得分:0)
目前尚不清楚如何定义“裁剪”散列,但我看到其中有四个目的:
数据存储。每个“裁剪”的表示形式都节省了存储空间,同时增加了对其的冲突。
零知识(使用哪个密码)。 (阅读:在保持沉默中有价值的时候保持沉默。)验证者知道:
(
输入)
是哈希(
answer )
是哈希(
错误答案)
不是哈希(
答案2 )
为哈希。但是他不知道输入是答案还是答案2。 (阅读:不要冒充Verifier,也不要费心地/确定Verifier来确定输入是否为<黎明攻击>。<正午攻击>散列为相同的结果。
[btw这可能会被滥用,所以我将其省略]