6

If I were to leave a SHA2 family hash out on my website - how long would it be considered safe? How long would I have before I could be sure that someone would find a collision for it and know what was hashed?

I know that the amount of time would be based on the computational power of the one seeking to break it. It would also depend on the string length, but I'm curious just how secure hashes are.

Since many of us run web-servers we constantly have to be prepared for the day when someone might make it all the way to the database which stores the user hashes. So, move the server security out of the way and then what do you have?

This is a slightly theoretical area for many of the people I have talked with, so I would love to actually have some more information about average expectations for cracking.

hash('sha256', 'mytext');
hash('sha256', 'thisismytext');
hash('sha256', 'xx$1sw@the4e');
hash('sha256', 'thisismyslightlylongertext');

db695168e73ae294e9c4ea90ff593e211aa1b5693f49303a426148433400d23f
b62c6ac579abf8a29e71d98aeba1447c66c69002cfd847b148584f886fd297ef
501f1b26abbc75594d06f0935c8bc502d7bcccf5015227bd6ac95041770acb24
3debc12761bbeb5b4460978ac2be5b104163de02ea799f0705399d0e5b706334
4

3 回答 3

18

首先,您不是在谈论碰撞。冲突是指有人发现两条不同的消息,它们的哈希值相同。在这里,您不必担心有人会找到另一个与您发布的值散列的输入;事实上,你害怕有人发现你的意见。正确的术语是原像攻击。有时,我们说攻击者试图“反转”散列函数(找到与给定输出匹配的输入)。

有两种方法可以尝试找到给定哈希值的原像:利用哈希函数的弱点,或者通过尝试候选来猜测输入。

SHA-2 在抗原像性方面没有已知的弱点。说到这里,MD5 甚至 MD4 都没有这样的已知弱点,尽管从密码学的角度来说,这两个功能被认为是彻底破坏的。因此,除非哈希函数的科学研究取得巨大进展,否则您的哈希值很可能不会通过哈希函数密码弱点被发现。

根据攻击者对输入的了解,尝试候选者可能是可能的,也可能不是。这很难准确建模。例如,假设输入是一个包含七个字母的单词。有 26 7 = 8031810176 个这样的词。使用 SHA-256 尝试所有这些,每次都与您的哈希值进行比较,在最近的 PC 上需要几分钟时间,但实现起来很简单。

在更一般的基础上,探索可能的输入集合称为字典攻击,因为它通常应用于恢复用户密码的问题:用户非常缺乏想象力,并且经常从有限的一组“单词”中选择密码,并且将这组单词称为“字典”似乎是合乎逻辑的。我们也称其为“蛮力”或“穷举搜索”。

假设字典足够小,攻击者可以实际尝试所有单词,那么不仅您的哈希值最终会被反转(如果攻击者有足够的激励),而且这也为成本分摊开辟了道路:攻击者可能会尝试在几个类似的攻击情况下共享他的计算工作(即使用相同的哈希函数反转几个哈希值——同样,一个常见的与密码相关的攻击模型)。一个基本的成本分摊方法是制作一个预先计算的表:攻击者计算他的字典的所有哈希值一次; 然后,只需在表中查找哈希值,就可以攻击所有后续的哈希值。查找速度非常快(攻击者按升序对哈希进行排序)。彩虹表是一种预计算表,以一种允许紧凑表示的智能方式:它们使攻击者可以“保留”一个大的预计算表,而无需大量硬盘。尽管如此,彩虹与否,表中的所有值(前一个彩虹表的情况下的压缩)必须由某处的攻击者至少计算一次,即某人能够进行完整的字典攻击。这有两个成本:CPU 成本(用于计算所有哈希)和存储成本(用于存储哈希值)。彩虹表使存储更便宜,但在 CPU 方面并没有改善。

Salting 会击败预先计算的表(包括彩虹表)。它使小字典更容易忍受。也就是说,如果我们假设反转一个哈希值是可行的,那么盐会确保,至少,攻击者将不得不支付每次字典攻击的全部 CPU 成本,并且他将无法共享他在多次攻击或与其他攻击者之间的成本。密码需要加盐,因为一般来说,让普通用户从足够大的可能密码集中选择和记住密码是不可能的。

如果您的输入来自足够大的字典以击败单个暴力破解,那么它仍然会好得多。重要的是输入字符串可能采用的值集的大小;必须根据攻击者对受攻击数据的了解来估计该集合。例如,如果攻击者试图找到用户密码,那么他知道输入字符串很短(用户没有耐心),并且只包含可以在键盘上输入(盲目!)的字符;而且他还知道序列是可以记住的,这使得像“.%f*(.ds/~\d09j@”这样的事情不太可能。输入大小本身没有限制;我们说彩虹表是有限的到“15 个字符左右” 因为接受输入超过 15 个字符的用户也会从太大的一组密码中选择密码,以允许构建表所需的单一暴力操作。请注意,尝试所有15 个字符的序列已经太多了(即使所有 15 个小写字母的序列也意味着超过 2 70次散列计算,而这对于当今的技术来说是不可行的)。

于 2011-01-14T13:26:27.263 回答
4

托马斯的回答已经很详细了,但我会添加这个标准:

打破哈希有什么好处?

在街上丢一分钱。需要多长时间才能有人捡起它?
现在扔掉一张 20 美元的钞票,做同样的实验。

如果您要保护的内容的价值很低,则可能根本没有人会尝试破坏散列。

如果破解哈希的价值和收益很高,那么它只有在从亚马逊云购买必要的计算能力时才能生存。他们现在甚至销售 GPU。

于 2011-01-20T21:32:38.600 回答
0

您假设没有针对您的设置的彩虹表可用,这不是给定的。恕我直言,当它泄露的那一刻就认为它坏了。即使使用bcrypt,您也无法确定在您的哈希公开之前已经完成了多少工作。

于 2011-01-14T03:31:15.300 回答