SHA加密如何实现?

3

重复:

关于哈希的困惑


当存在无限数量的输入字符串但只有有限数量的40个字符哈希时,SHA加密如何为任何字符串创建唯一的40个字符哈希?


重复:https://dev59.com/Q0fRa4cB1Zd3GeqP7DSA - Gleb
9个回答

23

旁边的问题[请原谅我的密码学无知]: 这是否意味着理论上两个不同的输入字符串可能会产生相同的哈希值? - BenAlabaster
这种情况非常不可能发生,以至于人们通常认为永远不会发生。 - Henk

8
简单来说,它不会为任何字符串创建唯一的40个字符哈希 - 不可避免地,不同的字符串将具有相同的哈希值。但它确实尝试确保相似的字符串具有非常不同的哈希值。40个字符是一个相当长的哈希值,因此除非您在做荒谬的数量,否则碰撞的几率相当低。

5

SHA不会为任何字符串创建唯一的40个字符哈希。如果您创建足够多的哈希,最终会发生冲突(两个输入的哈希值相同)。使SHA和其他哈希函数具有加密用途的是没有简单的方法可以找到两个具有相同哈希值的文件。


3

对jdigital的回答进行详细说明:

由于这是一个哈希算法而不是加密算法,因此没有必要反转操作。这又意味着结果不需要唯一;理论上有无限数量的字符串将导致相同的哈希值。不过,实际上找出哪些是相同的几乎是不可能的。


2
该函数的功能类似于:
hash1 = SHA1(plaintext1)
hash2 = SHA1(plaintext2)

现在,hash1和hash2在技术上可以是相同的。这是一种碰撞。虽然不常见,但可能发生,并且不会造成问题。

真正的魔力在于无法做到这一点:

plaintext1 = SHA1-REVERSE(hash1)

所以,您永远无法将其反转。如果您只想知道用户两次输入的密码是否相同,则非常方便。想一想,您有1024字节的输入。您得到40位输出。您如何从40个字节中重构这些1024个字节 - 您丢失了信息。这是不可能的(嗯,除非您设计算法允许它)。
另外,如果40位不够用,请使用SHA256或其他具有更大输出的算法。并加盐。加盐很好。
哦,顺便说一下:任何通过电子邮件向您发送密码的网站都没有散列密码。它们要么将其存储为未加密的形式(逃走,尖叫着逃走),要么使用双向加密(DES、AES、公钥-私钥等 - 对它们稍微信任一点)进行加密。
没有任何理由让网站能够通过电子邮件向您发送密码,或者需要存储除哈希之外的任何东西。/发牢骚。

2

像SHA-1或SHA-2家族这样的哈希算法用作基于密码的身份验证中的"单向"哈希。计算上不可行找到一个消息(密码)的哈希值。因此,如果攻击者获得了哈希密码列表,他们无法确定原始密码。

您是正确的,一般来说,有无限数量的消息可以哈希到给定值。但要找到其中一个仍然很困难。


2
它并不保证两个字符串将具有唯一的40个字符哈希。它所做的是提供一个极低的概率,使得两个字符串有冲突的哈希,并且使得创建两个冲突文档变得非常困难而不仅仅是随机尝试输入。
通常来说,某件坏事发生的概率足够小就好像保证它永远不会发生一样。只要像彗星撞击地球那样结束世界的可能性更大,哈希碰撞的机会通常不值得担心。
当然,安全哈希算法并非完美无缺。因为它们用于密码学,所以尝试破解它们是非常有价值的。例如,SHA-1 已被削弱(你可以在比随机猜测少2000次猜测中找到碰撞);MD5已经完全被破解,安全研究人员实际上已经创建了两个证书,这两个证书具有相同的MD5摘要,并且其中一个获得了证书颁发机构的签名,从而允许他们使用另一个证书,就好像它已经被证书颁发机构签名一样。您不应该盲目地信任加密哈希;一旦一个哈希算法被削弱(例如SHA-1),就需要寻找新的哈希算法,这就是为什么目前存在竞赛来创建新的标准哈希算法的原因。

0

观察得不错。简短的回答是它不能,这会导致冲突,而这些冲突可以被利用在生日攻击中。


0
简单的答案是:它不会创建唯一的哈希值。看看鸽巢原理。发生冲突的可能性非常小,以至于没有人曾经发现过这种情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接