更新:请注意,我不是在问什么是盐,什么是彩虹表,什么是字典攻击,或者盐的用途。我在问:如果你知道用户salt和hash,计算他们的密码不是很容易吗?
我了解这个过程,并在我的一些项目中自己实现它。
1 2
| s = random salt
storedPassword = sha1(password + s) |
在存储的数据库中:
1
| username | hashed_password | salt |
号
我看到的每一个salt实现都会在密码末尾或开头添加salt:
1 2
| hashed_Password = sha1(s + password )
hashed_Password = sha1(password + s) |
因此,一个值得使用salt(ha ha ha)的黑客对字典进行攻击,只需对上面列出的常见组合中存储的salt运行每个关键字。
当然,上面描述的实现只是为黑客添加了另一个步骤,而没有实际解决底层问题?有什么方法可以解决这个问题,还是我误解了这个问题?
我唯一能想到的是有一个秘密的混合算法,将salt和密码以随机模式放在一起,或者在哈希过程中添加其他用户字段,这意味着黑客必须访问数据库和代码才能放在这些字段上,这样字典攻击才能证明是有效的。(更新,正如评论中指出的,最好假设黑客可以访问您的所有信息,所以这可能不是最好的)。
让我举一个例子,说明我如何建议黑客使用密码和哈希列表对用户数据库进行黑客攻击:
来自黑客数据库的数据:
1 2 3
| RawPassword (not stored) | Hashed | Salt
--------------------------------------------------------
letmein WEFLS... WEFOJFOFO... |
。
常用密码字典:
1 2 3 4 5
| Common Password
--------------
letmein
12345
... |
对于每个用户记录,循环常见密码并散列它们:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| for each user in hacked_DB
salt=users_salt
hashed_pw = users_hashed_password
for each common_password
testhash = sha1(common_password + salt)
if testhash = hashed_pw then
//Match! Users password = common_password
//Lets visit the webpage and login now.
end if
next
next |
。
我希望这能更好地说明我的观点。
假设有10000个常见密码和10000个用户记录,我们需要计算100000000个散列来发现尽可能多的用户密码。可能需要几个小时,但这不是真正的问题。
裂缝理论研究进展
我们假设我们是一个损坏的网络主机,可以访问一个包含sha1散列和salts的数据库,以及混合它们的算法。数据库有10000条用户记录。
这个站点声称能够使用GPU计算每秒2300000000个sha1哈希。(在现实世界中,情况可能会变慢,但现在我们将使用引用的数字)。
(((95^4)/2300000000)/2)*10000 = 177
seconds
号
给定95个可打印的ASCII字符的完整范围,最大长度为4个字符,除以计算速率(变量),再除以2(假设发现密码的平均时间平均需要排列的50%),对于10000个用户,计算出长度小于等于4的所有用户密码需要177秒。
让我们调整一下以适应现实。
(((36^7)/1000000000)/2)*10000 = 2 days
号
假设不区分大小写,密码长度<=7,只有字母数字字符,需要4天的时间来解决10000个用户记录,我已经将算法的速度减半,以反映开销和非理想情况。
重要的是要认识到这是一个线性蛮力攻击,所有的计算都是相互独立的,因此对于多个系统来说,这是一个完美的任务。(也就是说,可以轻松地设置两台计算机,从不同的终端运行攻击,这将使执行时间缩短一半)。
考虑到递归散列密码1000次,使此任务的计算成本更高:
(((36^7) / 1 000 000 000) / 2) * 1000
seconds = 10.8839117 hours
号
这表示最大长度为7个字母数字字符,对于一个用户,执行速度低于引用数字的一半。
递归散列1000次可以有效地阻止覆盖攻击,但是针对用户数据的目标攻击仍然很容易受到攻击。
- salting中的关键是防止您查看哈希密码,并看到多个用户具有相同的哈希(因此具有相同的密码)。如果不使用salting,您只需使用哈希算法并生成所有可能的哈希,然后对该哈希进行野蛮搜索。由于算法从未改变过,它使攻击者可以预测,加盐只是让它变得更加困难。
- 这里详细讨论了:stackoverflow.com/questions/420843/&hellip;
- 谢谢@be,我想我想说的是,它是一种非常安全的方法,而实际上它不是,它只是掩盖了数据,足以让黑客的工作更令人恼火。
- 是的,但是如果您使用一个足够复杂的哈希算法和一个好的伪随机盐,那么您可以将解决问题的复杂性推到任何现代/未来硬件上物理不可能的领域。2^128是一个非常大的数字!
- 如果黑客可以访问salt+散列密码,他们只需运行所有salt+字典密码组合,对于n个字典密码,您需要对每个用户帐户执行n个散列计算,计算成本要高得多,但对于笔记本电脑来说,在几个小时左右的时间内执行起来非常容易。我不确定我的问题是否足够清楚?
- 因为饼干就像鼻涕虫,盐会使他们皮肤上的粘液变干,杀死他们。
- @T.E.D.:我更喜欢咸饼干。盐腌的鼻涕虫,没那么多。
- @汤姆-在你的例子中攻击。如果没有salt,那么攻击者可以对每个常用密码执行"哈希"操作。这与一个或多个用户匹配吗?是的,我有他们的密码"-攻击者可以"并行"攻击所有密码,而不需要额外的费用。
- @汤姆·古伦-你只有一半的照片。如果没有salt,攻击者就不会使用"更新2"中演示的方法。他只需在一个表中进行一次查找,然后在O(1)或O(log n)时间中获取密码(n是候选密码的数量)。盐是阻止这种情况发生的原因,并迫使他使用您演示的O(N)方法。另一种技术(关键强化)可以使你循环中的每一次尝试都需要一整秒钟,这意味着进行这些测试需要3年时间…只有10万个密码,你很可能在那时破解零个密码。
- 我不知道你是在假设盐也被泄露了。虽然技术上你是正确的,但真正的问题是黑客在我们开始之前已经破坏了整个数据库。这是一个比他能在3天内破解普通密码大得多的问题;)Salting并不是为了阻止你所说的内容,而是为了防止黑客一次性访问你数据库中的每个密码。它只是一种给攻击者带来不便的方法
- @埃里克森·基斯·斯特宁是另一个好观点。使散列算法的计算代价很高,您再次使破解的可能性降低。
- 谢谢,在现实世界中,当密码列表被黑客攻击而无法访问salt值时?这可能比我想象的要普遍,只是想知道。
- 还谢谢你埃里克森,你的意思是重新计算结果说100次,使它计算起来昂贵吗?或者使用更重的哈希算法?我可以看出这很有效,但我在网上读过的任何文章或指南都没有提到这一点。
- @Tom Gullen-我的意思是重新散列结果,比如说2000次(你必须考虑到攻击者会使用一些快速的东西,而不是php),所以计算单个密码的散列值需要很短的时间。这可以在标准的密钥派生算法pbkdf1和pbkdf2中找到,它们来自pkcs 5,这使得密码混淆算法非常好("派生密钥"是"hash")。上面的很多用户之所以参考本文,是因为它是对JeffAtwood的一个响应。
- 汤姆:一般认为,你的代码永远都和你的数据库可能会成为公共知识。这意味着,该方法具有混合盐的秘密的密码,你提到的,是一个坏的思想精华,用在人的安全obscurity。我看你是不是广告,但我只会说它是澄清。
- 顺便说一句,当然,你的一切是attacker SAH。在attacker承担托管公司员工谁是腐败的dumped表在你的网站的用户myprettypony.com这样他可以恢复密码,如果他们的工作和企业的在线citibank.com People’s帐户。好的设计方案与密码,这将是不可能恢复到这个家伙的任何密码。
- 感谢鲍里斯,但大量的安全是安全的通obscurity是不是吗?这是一所什么样的哈希?
- 谢谢你的澄清"埃里克森,把它放进一个答案应该是什么样的我真的是后的。
- 谢谢@埃里克森,优秀的文章的链接
- 问题:国有企业也213380 stackoverflow.com / / / / & hellip;stackoverflow.com与问题1645161 / & hellip;536584 stackoverflow.com /问题/和/ & hellip;
- 汤姆:关于安全:在通obscurity,它不是。安全是通过使用obscurity弱方法和assuming可以防止人从学习的方法是怎么说的。该盐是驱动点的平均成本(在时间,加工电源,磁盘空间,电子帐单,任何的攻击)的比预期的高值是由成功的给出了预期的时间或推远了成功的未来,这是不可不说,除了下一步(强制密码变化)。
- "谢谢,但我是dmckee,根据定义的安全obscurity印象不是盖的通"弱化"的解决方案?IE的定义,它不是由necesserially弱。你的意思是它的秘密点的方法是正确的,虽然,我点的是公共密钥加密(例如,因为你是一个秘密密钥的方法是结合’"?
- 我已经更新了一些数据的问题和各种情况下的裂纹时报在线的话,我已经学会了到目前为止,关于递归杂凑法保护毯的裂缝和我希望我有一个有趣的问题,但proved说,我们现在是怎么保护从攻击的目标?这是到该用户,如果你需要特殊的密码字符与字符的9个案例的敏感性,和你将看(95/1000000000(9))/ 2 = 1000秒)×××××××年的10000年的裂纹。
- 很抱歉,但这是不重复的问题,我reopen voted到操作系统。很多的反应似乎描述的盐是什么,为什么它的存在,而不是地址的问题。这是一个比这更多的特异性。
- 我们讨论的发生,比如操作系统加上它保持它的开放将是好的!
- "这是要避免的问题[……]需要扩展的常见问题讨论。"
它不能阻止字典攻击。
它所做的就是阻止那些设法从彩虹表中获取密码文件副本的人使用哈希表来确定密码是什么。
但最终,它可能会被残忍的强迫。这部分的答案是强迫用户不要使用字典中的单词作为密码(例如,至少需要一个数字或特殊字符)。
更新:
我本应该早点提到的,但有些(大多数?)密码系统对每个密码使用不同的salt,可能与密码本身一起存储。这使得一张彩虹桌毫无用处。这就是Unix Crypt库的工作原理,现代类Unix操作系统用新的哈希算法扩展了这个库。
我知道在较新版本的GNU Crypt中添加了对sha-256和sha-512的支持。
- +1 salt防止预先计算的哈希表(彩虹表)的列表有用。攻击者必须重新开始。
- @汤姆:那它就不再是彩虹桌了,它只是一个密码表。彩虹表的整个值是,有人花费了大量的计算时间来计算散列值,因此您可以立即反转散列值。
- @谢谢,但我的观点是盐并不能真正解决任何问题,因为使用密码列表是完全可行的。
- @汤姆:关键是,如果你使用一个好的哈希算法和相当复杂的密码,那么暴力强制是不可行的。对于密码哈希算法来说,sha1可能不是一个好的选择,因为它设计得很快。你想要设计得慢一点的。不幸的是,我找不到我最近读到的关于这个的文章,但我相信河豚是推荐的算法之一。
- 谢谢你的评论,这是一个有趣的话题。我读过的每一篇文章和指南都建议只使用md5/sha salt+密码,并将其保持在安全的状态。这些文章是过时的还是人们对这个问题的思考不够?
- 在PHP中,您可以使用mcrypt或bcrypt库进行比MD5或SHA1更好的加密。如果您坚持使用MD5或SHA1,那么应该"拉伸",在到达存储在数据库中的任何内容之前,您将密码散列1000次。这使熵保持不变,但增加了计算散列的时间。
- @汤姆·古伦,你在读什么文章?自荐专家或科学期刊上同行评议的文章?
- 不,但是你的普通Joe开发人员只会从成千上万的开发人员帮助指南中的任何一个中阅读一个教程。我认为,当人们为他们的博客或他们正在开发的任何小网站编写登录脚本时,期望人们阅读有关网络安全的科学期刊是不公平的。
- 一般的Joe开发人员都会撰写关于如何编写"安全"系统的博客/帮助文章。安全性不是你能从侧面了解到的,它需要广泛的知识。这不公平吗?可能。安全吗?在某种程度上。安全专家的存在是有原因的。但同样,并不是所有的东西都必须像诺克斯堡那样安全。这里的最佳策略是使用由这些专家设计的预构建系统,并对其进行修改以满足您的需要。
- @rmeador:这就是为什么GNUcrypt使用它进行多次传递的原因。我知道MD5是1000,我不知道新算法有多少。
- @R.Bemrose:确切地说,你可以使用这项技术来强化关键点,或者你可以使用一种天生缓慢的算法。我找到了一篇文章(不是我原来读到的那篇),是关于如何用这种方式使用河豚的,因为它有一个独特的特性,即更改键的速度非常慢。openwall.com/crypt
- 我认为重要的是要注意,尽管我完全同意它们是非常明智的,但预构建的系统会大量暴露在其体系结构或支持体系结构中发现的缺陷中。
- 为什么盐使彩虹桌无用?
- @乔:彩虹表是预编译的表。如果你用盐,通常不会有一个彩虹表具有特定的盐值。
- @为什么没有一张彩虹桌,上面有这种特殊的盐值?这不是完全取决于你用什么做盐吗?目前的解释对我来说不是很好,因为我觉得有很多假设
- @乔:因为盐几乎可以是任何东西。杰夫·阿特伍德在他的博客上谈到了这一点:codinghorror.com/blog/2007/09/rainbow-hash-cracking.html
- @r.bemrose所以我相信您所说的是,salt提供的好处只是延长了密码。在这种情况下,吃"A"盐几乎是没用的?
- 好的,我明白了。如果一个密码是咸的,而你不知道盐,那么你必须做很多有教育意义的猜测来找出密码是什么,因为sha1(存储的盐+用户输入的密码)==存储的哈希。但是我认为如果你能得到储存的土豆泥,那么你也可以很容易地得到盐。对我来说,这似乎不是不可能的。还有什么可以阻止你为大字符串生成彩虹表呢?
- @乔:有了足够大的盐,彩虹桌的大小使它不可能用于当前或未来的硬件。
- @科林,在这种情况下,我认为这是一个重要的区别。尺寸起着重要作用(取决于您的盐渍算法)
- 盐的大小与此毫无关系。关键是要将用户的密码修改为不会出现在彩虹表中的密码。彩虹桌上可能有字典里的每个单词。如果用户使用密码"apple",它将出现在表中。如果你用"a"盐让他们的密码"aapple",现在它就不会出现在桌子上了。为盐"A"定制一张桌子并不比为30个字符的盐更困难。
- @迈克尔:盐越长,你就需要预先计算所有可能的盐值,以便它出现在彩虹表中。重点是,您不必为所有密码保留相同的salt,您可以为每个密码随机选择它,并将其存储在存储的hashed salt密码旁边的数据库中。因此,黑客需要在彩虹表中为每个可能的大值盐输入一个条目,这就导致表太大而不可行,这就是重点。
- @迈克尔:做一张30种盐的桌子要比做所有单一盐的桌子困难得多。盐的大小至关重要。
- @格雷格:就像一个现实世界的例子,PCI不需要只有盐的长度。例如,它可以用srand (time(NULL));生成。
- @0A0D:那么?我当然不认为PCI是安全方面的第一个或最后一个词。
- @格雷格:我的观点是,重要的安全执行者并不认为盐的长度是重要的,只是增加了盐的长度。
是的,您只需要3天时间就可以使用sha1(salt密码)。这就是为什么好的密码存储算法使用1000次迭代散列:您需要8年时间。
- +1,最简洁明了的回答,到目前为止,我不知道这是一个选择。
- 显然,您从未在系统上执行哈希基准。你可以每秒进行数百万次的sha1计算。1000发子弹对攻击者来说毫无意义。另外-1,因为sha1是一个中断的哈希函数。
- 显然,我用的是问题中的名字和数字。如果你听说过主题和清晰度之类的事情…哦,是车。不要介意。
- @鲁克,1000发意味着需要1000倍的时间来蛮力。我觉得这是一个很好的特色。
- 如果攻击者可以猜到密码,那么登录时是否也可以猜到密码(或是我逃过的密码)?LOL)
- 请注意,在2013/2014年的时间范围内,pbkdf2迭代次数应在数万到数十万次之间,而不仅仅是1000次(wpa2本身只是pbkdf2-hmac-sha-1的4096次迭代)。
更准确地说,字典攻击(即尝试详尽列表中所有单词的攻击)并非"不可能",但却不切实际:每一位salt都将所需的存储量和计算量翻倍。
这与预先计算的字典攻击不同,比如涉及彩虹表的攻击,在彩虹表中,salt是否是秘密的并不重要。
示例:使用64位salt(即8字节),您需要在字典攻击中检查264个附加密码组合。用一本包含20万个单词的字典
200,000 * 264 = 3.69 * 1024
号
最坏情况下的测试-而不是20万个无盐测试。
使用salt的另一个好处是攻击者无法从字典中预先计算密码散列值。这只会占用太多的时间和/或空间。
更新
您的更新假定攻击者已经知道盐(或者已经偷了盐)。这当然是另一种情况。但攻击者仍然不可能使用预先计算的彩虹表。这里最重要的是散列函数的速度。为了使攻击不切实际,散列函数需要很慢。MD5或SHA在这里不是很好的候选者,因为它们设计得很快,哈希算法的更好候选者是河豚或它的一些变体。
更新2
关于密码散列安全问题的一个很好的读物(远远超出了最初的问题,但仍然很有趣):
Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes
号
文章的推论是:使用bcrypt(基于Blowfish)或eksblowfish创建的盐散列,它允许您使用可配置的设置时间来降低散列速度。
- 我认为这并不是不切实际的,只是稍微困难一些,因为一本大小为数千个密码的字典与数万个用户记录相比,在一台普通的台式电脑上是完全可以计算的。
- @TomGullen-使用正确的密码选择策略(至少9个字符,包括数字、混合大小写和符号),您不会通过尝试几千个密码破解许多帐户。
- 有了正确的密码选择策略,您根本不需要盐,是吗?也许我误解了这个问题。
- 请参考我的第二个更新示例,这是否相关?
- @Tom Gullen-即使有合理的强密码策略,一本数亿或几十亿名候选人的字典也有可能获得一些点击率,因为所有的密码都不太可能(因为人们使用助记键而不是RNG来选择它们)。如果不使用盐,那么这种大小的字典可以在商品系统上预先计算。如果使用salt,攻击者必须每次重新计算哈希,如果执行了足够的哈希迭代,则攻击者的攻击速度可以降低到每秒几次尝试。
- 投反对票的人,你能解释一下吗?尤其是如果有什么不正确的地方,最好知道。
- 我是投反对票的人,但我读错了,所以我取消了投反对票。不过,我想指出的是,如果用户能够访问存储密码的数据库(正如您所假定的那样),那么salt可能是已知的(它们通常以明文存储在哈希密码旁边)。如果他们从前端攻击它,那么暴力或字典攻击不会受到盐的存在的影响(除非盐的计算成本很高)。前端的目标应该是延迟和/或防止盲目猜测,后端应该安全地进行salt。
- -我说:保守秘密完全不是盐的问题。不管怎样,您都需要可以访问它们来检查密码,因此任何对它们保密的尝试都可能通过增加复杂性而不是实际成功使系统更容易受到攻击。
- @迈克尔:你可能误解了我的答案。我指的是,如果攻击者不知道salt,那么检查单词列表中项目的计算量实际上会增加,即每一位salt增加一倍。你想让计算变得昂贵。
- 很好的回答和讨论。多亏了所有的答案,我学到了很多。
- @0xA3:同样:攻击者不知道不是盐的要点。您的机器需要以某种方式访问它,因此闯入机器的攻击者也可以获得它。任何攻击者不知道盐是红鲱鱼的情况。
- 盐不需要是秘密。stackoverflow.com/questions/3347035/&hellip;
- 我认为值得一提的是,链接的文章mis描述了彩虹表。他所描述的是一个简单的字典附件。彩虹桌真的很不一样(而且有些复杂)。在kestas.kuliukas.com/rainbow tables上有一个关于彩虹表是如何工作的很好的解释。
- -"当然,盐需要保密"。如果攻击者可以访问您的密码散列,他也将拥有您的盐分-您需要的是每个用户的盐分,而不是通过隐藏的"隐藏"盐分的安全性。
- 我也在问关于猜测登录名的问题,这是比密码容易还是从一开始就不是攻击者的问题?
字典是一种按键索引值的结构。在预计算字典攻击的情况下,每个键都是一个散列,相应的值是导致散列的密码。有了预先计算好的字典,攻击者就可以"立即"查找密码,从而生成登录所需的哈希。
有了salt,存储字典所需的空间会快速增长&hellip;,因此尝试预计算密码字典很快就变得毫无意义。
最好的盐是从密码随机数生成器中随机选择的。八个字节是实际大小,超过16个字节没有任何作用。
Salt不仅仅是"让攻击者的工作更令人恼火",它还消除了所有类型的攻击,即使用预计算字典。
另一个元素是完全保护密码所必需的,那就是"加强密钥"。一轮sha-1还不够好:一个安全的密码散列算法的计算速度应该非常慢。
许多人使用pbkdf2,一个密钥派生函数,它将结果反馈给哈希函数数千次。"bcrypt"算法类似,使用缓慢的迭代密钥推导。
当散列操作非常缓慢时,预计算表对攻击者来说越来越可取。但是,适当的盐会破坏这种方法。
评论
下面是我对这个问题的评论。
如果没有salt,攻击者就不会使用"update 2"中演示的方法。他只需在一个预先计算的表中进行查找,并在O(1)或O(log n)时间(n是候选密码的数量)中获取密码。salt是防止这种情况发生的原因,并强制他使用"更新2"中所示的O(N)方法。
一旦减少到O(N)攻击,我们必须考虑每次尝试需要多长时间。密钥增强可能会导致循环中的每一次尝试都需要一整秒钟,这意味着在10万用户上测试10万密码所需的时间将从3天延长到3年&hellip;,而只有10万密码,则很可能在这段时间内破解零密码。
您必须考虑到攻击者将使用他所能使用的最快的工具,而不是PHP,因此数千次迭代(而不是100次)将是增强密钥的一个好参数。计算单个密码的散列值需要花费一秒钟的大部分时间。
密钥增强是标准密钥派生算法pbkdf1和pbkdf2的一部分,来自pkcs 5,这使得密码混淆算法非常好("派生密钥"是"hash")。
StackOverflow上的许多用户之所以引用本文,是因为它是对JeffAtwood关于彩虹表危险性的文章的回应。这不是我最喜欢的文章,但它确实更详细地讨论了这些概念。
当然,您假定攻击者拥有一切:salt、hash、用户名。假设攻击者是一名损坏的托管公司员工,他将用户表转储到myprettypony.com fansite上。他正试图恢复这些密码,因为他会回头看看你的小马粉丝是否在他们的花旗银行账户上使用了相同的密码。
有了一个精心设计的密码方案,这家伙将不可能恢复任何密码。
- +1个很好的答案谢谢。
- 我认为,通过"字典攻击",Tom指的是尝试已知的弱密码(即直接从人类语言字典中删除),而不是预先计算的哈希明文表——这也是我在本文中阅读"字典"时首先想到的。
- @迈克尔:我同意,@erickson指的是预先计算好的字典攻击。
- salt停止预先计算的字典攻击。关键强化阻止字典攻击。两者必须一起用于安全密码验证。
- 我的意思是简单的英语桌子是的。这个问题的目的是解决如何阻止黑客为每个用户帐户计算出所有可能的哈希组合的问题。
加盐的目的是防止攻击者的努力被浪费。
如果没有salt,就可以在世界上每个数据库的每个用户上使用一个预先计算的哈希密码条目表(例如,所有字母数字5个字符串的md5,易于在线查找)。
使用特定于站点的salt,攻击者必须自己计算表,然后才能在站点的所有用户上使用它。
对于每个用户的salt,攻击者必须分别为每个用户进行这项工作。
当然,这对于直接从字典中保护非常弱的密码没有多大作用,但它可以保护相当强的密码免受这种摊销。
- 简短而精确的回答-值得补充的是,如果没有盐或站点范围内的盐,您可以很容易地发现具有相同密码的用户,并且只需要暴力破解一个。对于每用户盐,您不能这样做。
另外-一个重要的点-使用特定于用户的salt防止检测到两个具有相同密码的用户-他们的哈希将匹配。这就是为什么很多次散列是散列(salt+username+password)
如果您试图对哈希保密,攻击者也无法验证哈希。
编辑-刚刚注意到要点是在上面的评论中提出的。
- +我错过了这一点,但这是一个很好的考虑
- 您应该编辑以指定每用户salt;使用站点范围salt的站点仍然允许您检测相同的密码。
- @斯内马尔奇-是的-非常感谢你的这一重要区别!
实施盐以防止彩虹表攻击。彩虹表是一个预先计算的哈希列表,这使得将哈希转换为短语更加简单。你需要明白,除非我们有一个现代的散列算法,否则用盐作为密码破解的现代预防措施是无效的。
所以,假设我们正在与sha1合作,利用最近使用该算法发现的漏洞,假设我们有一台计算机以每秒1000000个哈希的速度运行,需要530万年才能找到冲突,所以是的,php可以每秒工作300次,大的woop,这并不重要。我们盐的原因是,如果有人真的费心生成所有常见的字典短语,(2^160人,欢迎来到2007年时代的剥削)。
所以这里有一个实际的数据库,有两个我用来测试和管理的用户。
1 2 3
| RegistrationTime UserName UserPass
1280185359.365591 briang a50b63e927b3aebfc20cd783e0fc5321b0e5e8b5
1281546174.065087 test 5872548f2abfef8cb729cac14bc979462798d023 |
事实上,盐渍方案是您的sha1(注册时间+用户名)。去吧,告诉我我的密码,这些是生产中的真实密码。你甚至可以坐在那里用php拼凑出单词表。疯狂吧。
我不是疯了,我只是知道这是安全的。为了好玩,测试的密码是test。江户十一〔一〕号
您只需要为这个用户生成一个与27662aee8eee1cb5ab4917b09bdba31d091ab732垂直的彩虹表。这意味着我实际上可以让我的密码不受单个彩虹表的影响,黑客需要为27662aee8eee1cb5ab4917b09dba31d091ab732生成一个完整的彩虹表进行测试,并再次为briang生成f3f735311217529f2e20468004a2aa5b3dee7f。回想一下530万年的历史。想想只存储2^80哈希的大小(超过20字节),这是不可能发生的。
不要将salting混淆为一种生成哈希的方法,这是一种阻止彩虹表转换所有用户密码的方法。在这种技术水平上是不可能的。
- 我知道彩虹桌是什么,但你没有理解我的问题。如果你给我提供了你的salting算法、散列密码和salt,那么是的,我可能会在几分钟内告诉你你的密码是什么。
- 把你的钱放在你的嘴上?
- 当然,但是您刚刚告诉了我您的示例中的密码是什么,给我一个salt,散列密码,以及如何组合salt+密码(非递归),只要密码<=5个小写字母数字字符(无空格/特殊字符),我会让您知道这个框中是什么。如果你想让我按照你的建议来投资,尽管我对几分钟的评论可能被严重低估了,但在几小时之内是的。
- 实际上可能是几秒钟,请参阅golubev.com/hashgpu.htm,它使用gpu计算引用的"2300m/s sha1 hashes per second"。在95个ASCII字符的完整范围内,从1到6个字符,我们可以在6分钟内破解它。如果我们只有小写字母数字字符,长度小于25分钟最多8个字符。有了10000条用户记录的数据库,我们可以在<200秒内找到所有4个字符的完整ASCII密码(((95^4)/2300000000)/2)*10000)。(比引用的开销更多,并且引用的GPU速度可能是理想的情况)。
- 是的,加盐并不能阻止你暴力破解密码。如果用户有大约10个字符的密码,您很难生成((10^5)*(94^10))=10^24,这比没有哈希的10^19要困难得多。同样,这并不是让破解一个密码变得困难,而是让破解所有密码在预处理的彩虹表中变得不可行。(在这里检查我的数学,但我相信每个人的密码是10^25/2300000000/60/60/24/365/1000=137 869 ~ milinea)。如果我们想要更强大的密码,我们就不加盐,我们使用diffie–hellman密钥交换之类的东西。
- 破坏4个字符的密码并不是什么新鲜事。盐渍不会使它们更难破解,它会使数据库更难破解。
- 那么,有人破解过他的密码吗?
- 公平地说,我实际上学到了更多,标准的pkcs 5第4.2节说我应该至少运行1000次哈希函数的迭代,而不是一次。从那以后我也忽略了其他的考虑。docs.google.com/&hellip;
字典攻击背后的思想是,您获取一个散列值并找到密码,从中计算散列值,而不进行散列值计算。现在用盐密码做同样的事情-你不能。
不使用salt使密码搜索与在数据库中查找一样容易。添加salt会使攻击者对所有可能的密码执行哈希计算(即使对于dictionary attach,这也会显著增加攻击时间)。
- 在OP的场景中,攻击者拥有数据库中的salt,并且必须使用"字典"中的每个条目来尝试每个salt。…我想。
- 查看我更新的答案。
简单地说,salting并不能防止hash受到攻击(bruteforce或dictionary),它只会使它变得更难;攻击者要么需要找到salting算法(如果正确实现,将使用更多的迭代),要么使用bruteforce算法,除非非常简单,否则这几乎是不可能的。盐渍也几乎完全放弃了彩虹表查找的选择…
最简单的说法是:在不使用salting的情况下,每个候选密码只需要哈希一次,就可以与"已知世界"(受损数据库的集合)中的每个用户核对,这些用户的密码是通过相同的算法哈希的。使用salting时,如果可能的salt值的数量实质上超过了"已知宇宙"中的用户数量,则每个候选密码都必须为要测试的每个用户单独散列。
盐使得彩虹表攻击更加困难,因为它使单个密码哈希更难破解。假设你有一个可怕的密码,只有数字1。彩虹桌攻击会立刻破解这个。
现在假设数据库中的每个密码都是由许多随机字符组成的长随机值组成的。现在,您糟糕的密码"1"以哈希1加上一组随机字符(salt)的形式存储在数据库中,因此在本例中,彩虹表需要具有类似于:1的哈希。
所以假设你的salt是安全和随机的,比如说()%isldghasklu(%%),黑客的彩虹表需要有一个1*()%isldghasklu(%%的条目。现在,即使在这个简单的密码上使用彩虹表也不再实用。
- 请参见更新2,您只需拥有原始密码,并根据每个用户记录的盐计算所有哈希。
- 当然,汤姆,我同意,但关键是如果使用salt,黑客必须为每个密码做一次丑陋的耗时过程。因此,盐确实使使用彩虹桌变得更加困难。
- @汤姆·古伦:只有在使用全站范围的盐的情况下,才可以生成咸彩虹表;每个用户的盐分使得彩虹表攻击几乎毫无用处。