2014-10-09 61 views
0

我已经创建了一些字段的散列并使用'crypto'npm存储在数据库中。如何从node.js中的散列值获得原始值

var crypto = require('crypto'); 
var hashFirtName = crypto.createHash('md5').update(orgFirtName).digest("hex"), 

问题:如何在需要时从散列值中获取原始值?

回答

1

“散列”的basic definition是它是单向的。您无法从哈希中获取原始值。主要是因为单个值总是会产生相同的散列值,但散列值并不总是与单个值相关,因为大多数散列函数会返回一个有限/固定长度的字符串。

其他信息

我想提供一些额外的信息,因为我觉得我可能已经离开了这个太短。

正如@xShirase在他的回答中指出的那样,你可以使用一个表来反转一个Hash。这些被称为Rainbow Tables。您可以从互联网上生成或下载它们,通常来自恶意来源[ahem]。

为了扩展我的关于可能与多个原始值有关的散列值的其他陈述,让我们看看MD5。

MD5是一个128位散列。这意味着它可以保存2^128位或(无符号)0到340,282,366,920,938,463,463,374,607,431,768,211,455。这是一个非常大的数字。因此,对于任何给定的输入,您有340,282,366,920,938,463,463,374,607,431,768,211,456中的一个,它将与另一个输入值的相同散列结果相冲突。

现在,对于像密码这样简单的数据来说,机会是天文数字。为了这些目的,谁在乎?大多数情况下,您只是简单地进行输入,散列,然后比较散列。由于我不会涉及的原因,在使用哈希密码时,您应始终保存已经哈希的数据。你不想留下纯文本密码只是说谎。请记住,哈希是不是与加密相同。

哈希也可以用于其他原因。例如,它们可以用来创建一个名为Hash Table的快速查找数据结构。哈希表使用散列作为“主键”的排序,使其能够在相对较少数量的指令中搜索大量数据,并接近O(1)(按1的顺序)。根据哈希表和散列算法的实现,您必须通常通过排序列表来处理冲突。这就是为什么哈希表不是“完全”O(1),而是接近。如果你的散列算法不好,你的散列表的性能可能开始接近O(n)。

散列的另一种用途是判断文件内容是否已被更改或与原件匹配。您将看到许多OSS项目提供了也具有MD5和/或SHA-2哈希值的二进制下载。这样您就可以下载文件,在本地执行散列操作,并将结果与​​它们进行比较,以确保您获得的文件是他们发布的文件。同样,由于在340,282,366,920,938,463,463,374,607,431,768,211,456中两个文件匹配的几率是1,因此黑客成功生成一个具有相同大小的文件并且散列到完全相同的MD5/SHA-2散列的相同大小的文件的几率相当低。

希望这个讨论可以帮助你或者将来的某个人。

1

如果你能从哈希中获得原始值,那么它就不会那么安全。

如果您需要将值与以前存储为散列的值进行比较,则可以为此值创建散列并对散列进行比较。

在实践中,只有一种方法来“解密”散列。它涉及到使用大量的解密哈希数据库,并将它们与您的数据库进行比较。 An example here