我创建了一些字段的哈希并使用'crypto'npm存储在数据库中。
var crypto = require('crypto');
var hashFirtName = crypto.createHash('md5').update(orgFirtName).digest("hex"),
问题:如何在需要时从哈希值中获取原始值?
答案 0 :(得分:2)
"哈希"的basic definition这是单向的。您无法从哈希中获取原始值。主要是因为单个值总是会产生相同的哈希值,但哈希值并不总是与单个值相关,因为大多数哈希函数都返回一个有限/固定长度的字符串。
其他信息
我想提供一些额外的信息,因为我觉得我可能已经把它留得太短了。
正如@xShirase在他的回答中指出的那样,你可以使用一个表来反转哈希。这些被称为Rainbow Tables。您可以生成它们或从互联网上下载它们,通常来自邪恶的来源[哼]。
要扩展关于可能与多个原始值相关的哈希值的其他声明,让我们看一下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中的1,它将与另一个输入值的相同哈希结果冲突。
现在,对于像密码这样的简单数据,机会是天文数字。为了那些目的,谁在乎呢?大多数情况下,您只需要输入,散列它,然后比较哈希值。由于我不会介入的原因,当使用密码哈希时,您应该始终存储已经散列的数据。你不想只是说谎的纯文字密码。请注意,哈希 NOT 与加密相同。
也可以出于其他原因使用哈希。例如,它们可用于创建称为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 :(得分:1)
如果您可以从哈希中获取原始值,那么它就不会那么安全。
如果您需要将值与先前存储的哈希值进行比较,则可以为此值创建哈希并比较哈希值。
在实践中,只有一种方法可以解密'哈希。它涉及使用大量解密哈希数据库,并将它们与您的数据库进行比较。 An example here