可以轻松解密确定性哈希函数吗?

l--*_*''' 7 security encryption algorithm hash

可能重复:
是否可以解密md5哈希值?
是否有可能扭转sha1?

我问了这个问题: 使用巨大的电子表格

得到了一个很好的答案,我遵循了建议.我用过这个:http: //splinter.com.au/blog/?p = 86

我在excel电子表格的列中散布了大约300,000个不同的元素

既然你可以这样做:

=SHA1HASH('The quick brown fox jumps over the lazy dog')
Run Code Online (Sandbox Code Playgroud)

你会回来的:

2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Run Code Online (Sandbox Code Playgroud)

你也不能倒退吗?

我说如果它每次都以相同的方式加密同一文本,那有什么意义呢?

如果您确实知道哈希算法,是否可以倒退?

你能不能简单地向我解释哈希是如何工作的?如何将20gb转换为40个字符的哈希?是否需要很长时间来散列20gb的硬盘?

Mar*_*ers 23

一般答案

一个加密散列函数不能轻易逆转.这就是为什么它有时也称为单向函数.没有回头路.

你应该小心调用这个'解密'.散列与加密不同.可能的散列值集合通常小于可能的输入集合,因此多个输入映射到相同的输出.

对于给定输出的任何散列函数,您无法知道使用了多少输入来生成此特定输出.

对于像SHA1这样的加密哈希,甚至很难找到一个产生该输出的输入.

反转加密哈希的最简单方法是猜测输入并对其进行哈希以查看它是否给出了正确的输出.如果你错了,再猜一遍.另一种方法是使用彩虹表.

关于使用散列来加密SSN

使用SSN的用例,由于可能的输入值相对较少,因此攻击是可行的.如果您担心人们可以访问SSN,那么最好不要在您的应用程序中存储或使用SSN,特别是不要将它们用作标识符.相反,您可以找到或创建另一个标识符,例如电子邮件地址,登录名,GUID或只是递增的数字.使用SSN可能很诱人,因为它已经存在并且乍一看似乎是一个独特的不变标识符,但在实践中使用它只会导致问题.如果您出于某种原因绝对需要存储它,那么使用带有密钥的强大的非确定性加密,并确保您保持该密钥的安全.

  • 不,使用哈希算法是不可能的. (4认同)
  • +1,一旦你变黑,就不会再回头了 (2认同)
  • @Zak假设你知道这里的目标是SSN (2认同)

Tyl*_*nry 18

加密散列的整点是,你无法解密它,它不会每次加密方式相同.

密码哈希的一个非常常见的用例是密码验证.想象一下,我有密码"mypass123",哈希是"aef8976ea17371bbcd".然后,希望验证我的密码的程序或网站可以在其数据库中存储散列"aef8976ea17371bbcd"而不是密码,并且每次我想要登录时,该站点或程序都会重新散列我的密码并确保散列比赛.这允许站点或程序避免存储我的实际密码,因此在数据被盗或以其他方式受到损害的情况下保护我的密码(如果它是我在其他地方使用的密码) - 黑客将无法倒退从哈希到密码.

密码哈希的另一个常见用途是完整性检查.假设给定文件(例如,Linux发行CD的图像)具有已知的公共可用加密哈希.如果你有一个声称是同一个东西的文件,你可以自己散列它,看看散列是否匹配.在这里,它每次以相同的方式散列的事实允许你独立地验证它,并且它是加密安全的事实意味着没有人可以可行地创建一个不同的假文件(例如,其中有一个木马)相同的哈希.

但请记住散列和加密之间非常重要的区别:哈希丢失了信息.这就是为什么你不能倒退(解密)哈希.您可以散列20 GiB文件,最后使用40-some字符散列.显然,这在过程中丢失了很多信息.你怎么可能"解密"40个字符到20GiB?压缩没有那么好用!但这也是一个优点,因为为了检查20 GiB文件的完整性,您只需要分发40个字符的哈希值.

由于信息丢失,许多文件将具有相同的散列,但加密散列的关键特性(正如您所说)是尽管信息丢失,但从文件开始计算是不可行的.并构造一个具有相同散列的第二个略有不同的文件.具有相同散列的任何其他文件将完全不同,并且对于原始文件不容易错误.

  • 但用户正在定位SSN号码.这里的每个人都应该提醒他给哈希加盐. (2认同)

Zak*_*Zak 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
Run Code Online (Sandbox Code Playgroud)

他们必须跑

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
Run Code Online (Sandbox Code Playgroud)

..等等,直到他们最终到达

SHA1HASH(123-45-6789MOONBEAM) -> check hash match
Run Code Online (Sandbox Code Playgroud)

此时他们终于成功破解了SSN + SALT

他们甚至不知道你的盐有多少个字符所以这就是10 ^(你的盐的字符数)是他们为了获得1个SSN所做的更多的工作,更不用说获得整个表了.

  • 盐不是秘密!盐应该附加到散列值,并用于防止字典攻击的预计算.您所指的更像是HMAC - 在这种情况下,您应该使用适当的HMAC而不是这种特殊方案. (7认同)
  • 存储H(SSN || salt)的可能攻击:如果攻击者将自己(或其他人,或虚构的SSN)注册到系统中,他们可能会找到与其注册和SSN的哈希相对应的行.因为他们已经知道他们自己的SSN所以他们可以使用这种信息来强制盐(MOONBEAM).一旦他们知道盐,他们就可以相对容易地获得其他SSN. (4认同)
  • @Zak秘密盐只是一个执行不力的HMAC.盐总是与哈希一起存储.正确使用的@Mark盐是为每个储存值随机生成的 - 一个条目上的盐与另一个条目上的盐没有任何关系. (4认同)

Jus*_*ier 7

不,你不能倒退,因为散列函数没有保留足够的信息.

您可以将其视为将原始文本映射到单个巨大数字的哈希函数.同样的数字也可以映射到其他文本,尽管好的散列函数几乎没有碰撞:

替代文字

如果原始邮件已加密,则是,您可以返回.


BC.*_*BC. 5

加密和散列是两回事.

哈希简单地将字符串摘要化为数字.加密会保留字符串的内容,以便以后可以解密.从散列中获取原始字符串没有任何方法.内容不存在.