如果你知道一个字符串的长度并对它应用SHA1哈希,你可以取消它吗?

时间:2011-12-16 23:43:41

标签: sha1

只是想知道原始字符串长度是否意味着您可以更好地取消SHA1加密。

5 个答案:

答案 0 :(得分:2)

不,不是一般情况:哈希函数不是加密函数,并且它不是可逆的。

通常无法恢复原始哈希值。这是因为散列函数的域大小大于函数的范围。对于SHA-1,域是无界的,但范围是160位。

这意味着,通过域中的Pigeonhole principle多个值映射到范围中的相同值。当这两个值映射到同一个哈希时,它被称为hash collision

但是,对于特定的有限的输入集(其中输入的域小于散列函数的范围),那么如果是哈希冲突找到,例如通过强力搜索可能是“可接受的”,以假设导致哈希的输入是原始值。上述过程实际上是preimage attack。请注意,这种方法很快变得不可行,如底部所示。 (对于给定的域大小,可能有一些很好的数学公式可以定义“可接受”的碰撞机会,但我并不精通。)

知道这是映射到哈希的 only 输入的唯一方法是对范围内的所有值执行穷举搜索 - 例如具有给定长度的所有字符串 - 并确保它是导致给定散列值的唯一此类输入。

但请注意,在任何情况下哈希进程都不会“反转”。即使没有 Pigeon hole原则,SHA-1和其他cryptographic hash functions特别设计为infeasible to reverse - 也就是说,它们是“单向”哈希函数。有一些先进的技术可用于减少各种哈希的范围;这些最好留给博士或专门从事密码学分析的人: - )

快乐的编码。


为了好玩,尝试对3个字符的字符串创建强力的原像攻击。假设仅允许英文字母(A-Z,a-z)和数字(0-9),在这种情况下存在“仅”62 3 (238,328)组合。然后尝试一串4个字符(62 4 = 14,776,336组合)... 5个字符(62 5 = 916,132,832组合)... 6个字符(62 6 = 56,800,235,584种组合)......

注意每个附加字符的域大小:这种方法很快变得不切实际(或“不可行”)并且哈希函数获胜: - )

密码破解程序加速前映像攻击的一种方法是使用rainbow tables(可能只覆盖设计用于攻击的域中所有值的小集),这就是为什么使用散列(SHA-1或其他)的密码也应始终具有大型随机盐

答案 1 :(得分:1)

如果可能的话,SHA1现在就不那么安全了。是吗 ? 除非你拥有相当大的计算能力 [2^80 operations] ,否则你不能。在这种情况下,您也不需要知道长度。

SHA1恰好是一个好Cryptographic hash function的基本属性之一是

it is infeasible to generate a message that has a given hash 

答案 2 :(得分:1)

散列函数是单向函数。对于给定的大小,有许多字符串可能产生该哈希值。

现在,如果您知道输入大小固定得足够小,假设10个字节,并且您知道每个字节只能包含某些值(例如ASCII的A-Za-z0-9),那么您可以使用该信息预先计算所有可能的哈希值,并找出哪个纯文本产生您拥有的哈希值。这种技术是Rainbow tables的基础。

答案 3 :(得分:1)

理论上,假设字符串也只是ASCII字符,而且大小为n。

ASCII中有95个字符,不包括控件。我们假设没有使用控件。

有95个这样的字符串。

有1.461501×10⁴⁸可能的SHA-1值(给定或取值)和刚刚n = 25,有2.7739×10⁴⁹可能的仅ASCII字符串,没有控件,这意味着保证碰撞(一些这样的字符串有相同的SHA-1)。

所以,即使有无限的资源和时间,我们也只需要达到n = 25即可。

请记住,到目前为止,我一直在使用我的ASCII规则轻松地制作它。现实世界的现代文本不遵循这一点。

当然,只有这些字符串的一部分可能是真实的(如果有人说“你好我的名字是乔恩”而另一个说“fsdfw09r12esaf”那么它可能是第一个)。但是,到目前为止,我正在假设无限的时间和计算能力。如果我们想在宇宙结束之前的某个时间解决它,我们就不能假设。

当然,攻击的性质也很重要。在某些情况下,我想找到原始文本,而在其他情况下,我会对使用相同哈希的乱码感到满意(如果我可以将其输入到期望密码的系统中)。

真的,答案是否定的。

答案 4 :(得分:1)

我发布这个作为另一个问题的答案,但我认为它适用于此:


SHA1是一种散列算法。散列是单向的,这意味着无法从输出中恢复输入。

这张图片有点展示了什么是哈希:

enter image description here

如您所见,John SmithSandra Dee都映射到02。这意味着您无法仅仅02恢复对哪个名称进行哈希处理。

哈希基本上是由于这个原则使用的:

如果hash(A) == hash(B),那么真的很有可能A == B。散列将大型数据集(如整个数据库)映射到微小的输出,如10个字符的字符串。如果移动数据库并且输入和输出的哈希值相同,那么您可以非常确定数据库是否完好无损。它比逐个字节地比较两个数据库要快得多。

可以在图像中看到。长名称映射到2位数字。


要适应您的问题,如果您使用强力搜索,对于给定长度的字符串(例如长度为l),您将需要在(dictionary size)^l个不同的哈希值之间进行哈希处理。

如果字典仅包含字母数字区分大小写的字符,那么您有哈希的(10 + 26 + 26)^l = 62^l哈希值。我不确定生成一个哈希需要多少FLOPS(因为它取决于哈希的长度)。让我们超级不现实并说它需要10 FLOP来执行一个哈希。

对于12个字符的密码,即62^12 ~ 10^21。到目前为止最快的超级计算机的10,000秒计算

乘以几千,如果我稍微增加字典大小或使密码更长,你会发现这是不可行的。