我问了这个问题: working with HUGE spreadsheet可能重复:
Is it possible to decrypt md5 hashes?
Is it possible to reverse a sha1?
并得到了一个很好的答案,我遵循了建议。我用过这个: http://splinter.com.au/blog/?p=86
我在excel电子表格的列中挖掘了大约300,000个不同的元素
因为你可以这样做:
=SHA1HASH('The quick brown fox jumps over the lazy dog')
你会回来的:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
你也不能倒退吗?
我说如果它每次都以相同的方式加密同一文本,那有什么意义呢?
如果您确实知道哈希算法,是否可以倒退?
你可以非常简单地向我解释哈希是如何工作的吗?如何将20gb转换为40个字符的哈希?是否需要很长时间来散列20gb的硬盘?
答案 0 :(得分:23)
一般回答
cryptographic hash function无法轻易逆转。这就是为什么它有时也称为单向函数。没有回头路。
你应该小心调用这个'解密'。散列与加密不同。可能的哈希值集合通常小于可能的输入集合,因此多个输入映射到相同的输出。
对于给定输出的任何散列函数,您无法知道使用了多少输入来生成此特定输出。
对于像SHA1这样的加密哈希,甚至很难找到产生该输出的一个输入。
反转加密哈希的最简单方法是猜测输入并对其进行哈希以查看它是否提供了正确的输出。如果你错了,再猜一遍。另一种方法是使用rainbow tables。
关于使用散列来加密SSN
使用SSN的用例,由于可能的输入值相对较少,因此攻击是可行的。如果您担心人们可以访问SSN,那么最好不要在您的应用程序中存储或使用SSN,特别是不要将它们用作标识符。相反,您可以找到或创建另一个标识符,例如电子邮件地址,登录名,GUID或只是递增的数字。使用SSN可能很诱人,因为它已经存在并且乍一看似乎是一个独特的不变标识符,但在实践中使用它只会导致问题。如果您出于某种原因绝对需要存储它,那么使用带有密钥的强大的非确定性加密,并确保您保持该密钥的安全。
答案 1 :(得分:17)
加密哈希的重点在于无法对其进行解密,而 每次都以相同的方式进行加密。
加密哈希的一个非常常见的用例是密码验证。想象一下,我有密码“mypass123”,哈希是“aef8976ea17371bbcd”。然后,希望验证我的密码的程序或网站可以在其数据库中存储散列“aef8976ea17371bbcd”而不是密码,并且每次我想要登录时,该站点或程序都会重新散列我的密码并确保散列比赛。这允许站点或程序避免存储我的实际密码,因此在数据被盗或以其他方式受到损害的情况下保护我的密码(如果它是我在其他地方使用的密码) - 黑客将无法倒退从哈希到密码。
加密哈希的另一个常见用途是完整性检查。假设给定文件(例如,Linux发行CD的图像)具有已知的公共可用加密散列。如果你有一个声称是同一个东西的文件,你可以自己散列它,看看散列是否匹配。在这里,它每次以相同的方式散列的事实允许你独立地验证它,并且它是加密安全的事实意味着没有人可以可行地创建一个不同的假文件(例如,其中有一个木马)相同的哈希。
请记住散列和加密之间非常重要的区别:散列丢失信息。这就是为什么你不能倒退(解密)哈希。您可以散列20 GiB文件,最后使用40-some字符散列。显然,这在过程中丢失了很多信息。你怎么可能“解密”40个字符到20GiB?压缩没有那么好用!但这也是一个优点,因为为了检查20 GiB文件的完整性,您只需要分发40个字符的哈希值。
由于信息丢失,许多文件将具有相同的哈希值,但加密哈希(这就是您所说的)的关键特性是,尽管信息丢失了,从文件开始并构造具有相同散列的第二个稍微不同的文件在计算上是不可行的。具有相同散列的任何其他文件将完全不同,并且不容易错误地用于原始文件。
答案 2 :(得分:9)
基于您试图隐藏社会安全号码的事实,我看到了您的观点。如果有人知道您在SSN上使用SHA1HASH来创建唯一标识符,那么可以生成所有SSN号码的快速列表,SHA1HASH它们,然后进行比较以自动获得记录中人员的SSN。更糟糕的是,他们可以在哈希查找表中预生成所有这些,并为每个SSN提供1个哈希的密钥。这称为哈希查找表,更复杂的表单称为彩虹表。
这就是为什么发明了哈希的第二个特征。它被称为盐腌。腌制基本上是这样的;你创建一个salt,然后使用salt修改你的数据。 例如,假设你有SSN 123-45-6789。你可以用字符串“MOONBEAM”加盐。您的新哈希字符串是“123-45-6789MOONBEAM”
现在,即使有人知道您正在对SSN进行哈希处理以生成您的唯一ID,他们仍然不知道您将使用的盐,因此无法通过预先散列列表来获取原始SSN。所有SSN并与您的ID进行比较。但是,您始终可以使用用户的SSN,使用salt,并重新搜索SSN + SALT以查看用户SSN是否与其ID匹配。
最后,如果你只使用1盐,并保守秘密,而不是能够看到盐,并通过运行SSN增量+盐1亿次并选择匹配来生成相应的SSN,他们必须做更多的工作来检索SSN。这是因为1亿个SSN号码具有相对较低的熵量。 (10 ^ 9种组合)。通过添加盐并保密,而不是仅仅运行
SHA1HASH(111-11-1111) -> check hash match
SHA1HASH(111-11-1112) -> check hash match
SHA1HASH(111-11-1113) -> check hash match
他们必须运行
SHA1HASH(111-11-1111a) -> check hash match
SHA1HASH(111-11-1111b) -> check hash match
SHA1HASH(111-11-1111c) -> check hash match
...
SHA1HASH(111-11-1111azdfg) -> check hash match
SHA1HASH(111-11-1111azdfh) -> check hash match
....
SHA1HASH(111-11-1111zzzzzzzzzzzzzzzz) -> check hash match
SHA1HASH(111-11-1112a) -> check hash match
SHA1HASH(111-11-1112b) -> check hash match
..等等,直到他们最终到达
SHA1HASH(123-45-6789MOONBEAM) -> check hash match
此时他们终于成功破解了SSN + SALT
他们甚至不知道你的盐有多少个字符 所以这就是10 ^(你的盐的字符数)是他们为了得到1个SSN所做的更多的工作,更不用说获得整个表了。
答案 3 :(得分:7)
不,你不能倒退,因为散列函数没有保留足够的信息。
您可以将其视为将原始文本映射到单个巨大数字的哈希函数。同样的数字也可以映射到其他文本,尽管好的散列函数几乎没有碰撞:
如果原始邮件已加密,则为是,您可以返回。
答案 4 :(得分:5)
加密和散列是两回事。
哈希简单地将字符串摘要化为数字。加密会保留字符串的内容,以便以后可以解密。从散列中获取原始字符串没有任何方法。内容不存在。
答案 5 :(得分:3)
没有。散列的重点在于它是单向加密(正如其他人指出的那样,它不是真正的“加密”,但在这里留在我身边)。缺点是,理论上,当两个或多个字符串返回相同的哈希时,存在“冲突”的小可能性。但这通常是值得的。
答案 6 :(得分:2)
好的哈希是一种方式,这意味着你不应该倒退。关键是提供字符串的键而不显示字符串。例如,这是在不存储密码的情况下匹配密码的好方法。相反,您存储一个哈希并比较输入的结果哈希值。
答案 7 :(得分:2)
没有。至少不容易。
SHA1仍然被认为是加密安全的。如果哈希算法很容易以一种方式计算,但是非常难(穷举搜索)来计算另一种方式,则哈希算法是安全的。确实,每次加密特定短语时,它都会产生相同的散列,但是有无限短语也会散列到相同的值。安全性来自于不知道那些其他短语是什么,直到你通过SHA1函数运行它们。
答案 8 :(得分:2)
不,你不能回去。计算你可以拥有多少不同的哈希值。现在计算你可以拥有多少个不同的字符串。第一个是有限的,第二个是无限的。有许多(无限多,准确)字符串具有相同的SHA1总和。然而,重点是找到两个具有相同哈希值的文本非常困难。
你可以认为哈希是缩短的东西。例如,使用散列函数,该函数对字符串中字母的所有ASCII代码求和。你不知道哈希之前是什么,只知道字母的ASCII码之和。它与SHA1类似,但更复杂。
散列的重点不是加密某些东西。散列的要点是缩短某些东西,因此检查两个东西是否相同会花费更少的时间。现在,如果你知道很多东西都有相同的哈希值,你怎么知道两件事情确实是一样的呢?好吧,你做不到。你只是假设它很少见,不会发生。
但是哈希不只是关于检查,因为使用哈希检查相等性通常仅用于确认/验证,并且它不是确定性的。如果您看到哈希值相同,那么基于特定哈希函数的参数,您可以估计哈希对象确实相同的概率。
这就是为什么散列函数总是为相同的对象产生相同结果的事实是散列函数最重要的特性。它允许您验证和比较对象。
答案 9 :(得分:1)
它每次都以相同的方式加密相同的文本是散列的整个点。这是一个功能。
如果我有一个密码哈希数据库,那么我可以通过哈希检查你是否输入了正确的密码,看看哈希是否与我在数据库中的匹配。但是如果有人偷走了我的哈希数据库,他们将无法弄清楚你的密码是什么,除非他们偶然发现了一些隐藏在该值上的纯文本。
答案 10 :(得分:1)
在密码学中,它被称为摘要。加密强大的摘要不允许基于摘要值获取源文本而无需其他一些知识。同一文本的摘要值相同,因此您可以计算文本的摘要并将其与已发布的摘要进行比较。一个流行的应用程序是密码验证,因此您可以保存摘要而不是密码。这当然容易发生你已经探索过的字典攻击,这就是强烈建议不要使用字典单词进行密码的原因。