SHA1 VS RSA:它们之间有啥区别?
Posted
技术标签:
【中文标题】SHA1 VS RSA:它们之间有啥区别?【英文标题】:SHA1 VS RSA: what's the difference between them?SHA1 VS RSA:它们之间有什么区别? 【发布时间】:2010-10-18 12:50:37 【问题描述】:SHA1 和 RSA 有什么区别?它们只是不同的算法,还是从根本上(即用于不同的事物)在某种程度上不同。
【问题讨论】:
“根本不同”是什么意思? 相关:What are the differences between MD5, SHA and RSA?, SHA, RSA and the relation between them. 【参考方案1】:根本不同。
SHA1 是一种散列算法,它是一种单向函数,将任意大小的输入转换为固定长度的输出(本例中为 160 位)。加密散列函数是这样一种函数,它不应该找到两个给出相同输出的输入,除非通过蛮力(例如,对于 128 位函数,您应该平均需要尝试 2^64 消息才能找到这样的“碰撞”是由于所谓的生日悖论 - 谷歌搜索更多信息)。
事实上,SHA1 不再是这种情况了——该算法(至少在密码学术语中)现在已经被破坏,Xiaoyun Wang 等人描述的碰撞攻击击败了经典的生日攻击。 SHA2 系列没有被破坏,NIST 正在进行一个过程,以就 SHA3 算法或算法系列达成一致。
编辑 - Google 现在已经生成并发布了一个实际的 SHA1 冲突。
RSA 是一种非对称加密算法,将输入加密为可解密的输出(对比无法反转的哈希算法)。它使用不同的密钥进行加密(公共密钥)与解密密钥(私有密钥)。因此,这可用于接收来自其他人的加密消息 - 您可以发布您的公钥,但只有拥有私钥的您才能解密已使用它加密的消息。
如果您反转 RSA 的密钥,它可用于生成数字签名 - 通过使用您的私钥加密某些内容,任何人都可以使用公钥对其进行解密,如果他们确定公钥属于您,那么他们就有信心你是加密原件的人。这通常与哈希函数一起完成 - 您对输入进行哈希处理,然后使用您的私钥对其进行加密,为您的输入消息提供一个固定长度的数字签名。
【讨论】:
碰撞问题传统上被称为“生日悖论”,而不是“效果”。 听说这两个都叫,但会编辑。当应用于尝试在哈希函数上查找冲突时,使用这种悖论或效果称为“生日攻击”,这是我最熟悉的三个术语! 还有一点需要注意的是,像 SHA-1 这样的散列算法可以在给定任意长度的数据作为输入的情况下计算摘要。非对称算法,如 RSA,在它们可以转换的数据长度方面受到限制。因此,很少使用 RSA 对原始消息进行签名,而是对原始消息的 SHA-1 摘要进行签名。消息的接收者及其签名计算消息的 SHA-1 摘要,然后使用发送者的公钥解密签名并验证摘要完全匹配。 很好的解释——你推荐使用 AES-256 还是 RSA 进行 e2e 加密?【参考方案2】:前面的答案已经足够解释了。但我认为你问这个问题只是因为 SHA 和 RSA 经常一起出现。所以让我解释一下为什么。
首先,请记住
RSA 效率不高,但 SHA 有效。
假设您下载了 Windows 7,并想确定它是否是 Microsoft 的原始 Windows 7。如果微软只是通过 RSA 加密 Windows 7,那将需要很长时间才能做到这一点,我们根本无法忍受。所以微软在 Windows 7 上使用 SHA1 并生成一个 160 位长的数据。然后微软用 RSA 签署这个 160 位长的数据(使用它的私钥)。
然后,您需要做的就是确保您的公钥来自 Microsoft。然后也使用 SHA1 生成 160 位长的数据。然后使用 RSA 的公钥解密微软的签名。然后你只需比较这两个 160 位长的数据,看看它们是否匹配。
【讨论】:
当您指的是签名时,您不应该谈论使用私钥进行加密。 什么意思? AFAIK,签名只是 RSA 从 SHA 生成的 128 位长数据中加密的数据(至少在这种情况下),我错了吗? 签名使用RSA私钥操作,就像解密使用私钥操作一样。加密始终使用公钥并添加像 OAEP 这样的加密填充。解密始终使用私钥并验证加密填充。另一方面,签名对消息进行哈希处理,像 PSS 一样添加签名填充,然后使用私钥操作。使用公钥进行验证。 另外,使用 RSA 签名而不对消息进行哈希处理的最大问题是,单个 RSA 块不能容纳超过 200 个字节。类似于 ECB 模式,通过将消息拆分成块并对每个块应用 RSA 私钥操作来签名是不安全的。 一个很好的观点(它可能不准确),但是SHA1 generates 160 bits, not 128。【参考方案3】:SHA1 是一种散列算法(文档和证书签名),而 RSA 是一种加密/解密算法(安全通信)。
【讨论】:
【参考方案4】:正如其他人所评论的,它们本质上是不同的东西,服务于不同的功能。您使用 RSA 将信息打乱成看似随机的形式,同时使用 SHA1 来确保消息的完整性(即所有位都没有更改)。在安全应用程序中,您将使用一种或两种,具体取决于您需要的功能。
【讨论】:
【参考方案5】:SHA1 是一种加密散列函数,而 RSA 是一种加密算法。
散列函数接受一段数据并返回一个固定长度的字符串。在密码散列函数中,所有返回字符串具有相同的概率。仅给定哈希数,您无法确定输入,也无法找到另一个给出相同哈希的输入(概率非常小的异常)。 Sha1 存在一些安全漏洞。
加密算法给出了一段数据,但输出不是固定长度 - 您的加密。给定输出(加密),您可以(如果您有正确的密钥)确定输入。
【讨论】:
【参考方案6】:安全散列算法 (SHA) 算法采用长度小于 264 位的消息并生成 160 位消息摘要。该算法比 MD5 略慢,但较大的消息摘要使其更安全地抵御暴力冲突和反转攻击。安全散列标准 (SHS, FIPS 180) 中指定的算法由 NIST 开发。 SHA-1 是 SHA 的修订版,于 1994 年发布;该修订版纠正了 SHA 中未发布的缺陷。它的设计与 Rivest 开发的 MD4 系列哈希函数非常相似。 SHA-1 也在 ANSI X9.30 标准中有所描述。
RSA 是一种公钥加密算法。它是已知的第一个适用于签名和加密的算法,也是公钥密码学的第一个重大进步。 RSA 广泛用于电子商务协议中,并且被认为是安全的,因为密钥足够长并且使用了最新的实现。
最显着的区别是 SHA 是一种加密算法,而 RSA 既是加密又是签名算法。
2005 年 8 月 16 日宣布可以在 2^63 操作中发现 SHA-1 中的冲突。这项研究成果归功于北京清华大学的王晓云教授,以及Andrew Yao教授和Frances Yao教授。它扩展了 Wang、Yin 和 Yu 的工作,证明可以在 2^69 次操作中发现碰撞。这意味着在 SHA 中比在 RSA 中更容易发生冲突 - 但值得注意的是,从未发现有两个相似的密钥发生冲突。
【讨论】:
SHA 不是加密算法。它是一种哈希算法。这些是不同的野兽。以上是关于SHA1 VS RSA:它们之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Flutter 中 required 和 @required 有啥区别。它们之间有啥区别,我们啥时候需要使用它们?