只是想知道原始字符串长度是否意味着您可以更好地取消SHA1加密。
答案 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是一种散列算法。散列是单向的,这意味着无法从输出中恢复输入。
这张图片有点展示了什么是哈希:
如您所见,John Smith
和Sandra 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
秒计算。
乘以几千,如果我稍微增加字典大小或使密码更长,你会发现这是不可行的。