MD5 工具输出十六进制值。以同样的方式,SHA 和 RSA 是否一起产生十六进制(或任何其他)输出?
MD5、SHA 和 RSA 算法有什么区别?
MD5 工具输出十六进制值。以同样的方式,SHA 和 RSA 是否一起产生十六进制(或任何其他)输出?
MD5、SHA 和 RSA 算法有什么区别?
这不是输出的类型。十六进制只是数据格式化的方式——因为它们都在处理二进制数据,所以十六进制很有意义。
重要的部分是他们做什么以及如何做:
MD5 和 SHA 是散列函数(SHA 实际上是散列函数家族)——它们获取一段数据,将其压缩并创建一个合适的唯一输出,而这很难用另一段数据来模拟。他们不加密任何东西——你不能获取 MD5 或 SHA 输出并“取消哈希”它以回到你的起点。两者的区别在于它们使用什么算法来创建哈希。另请注意,MD5 现在已被破坏,因为发现一种容易产生冲突的方式,不应再使用或信任。
RSA 是一种非对称加密算法。您有两个密钥(私有和公共),您可以使用一个密钥(加密或解密)执行一项功能,并使用另一个密钥进行反向操作。您使用哪个密钥取决于您是尝试进行数字签名还是加密。
MD5 是一种加密散列函数。“SHA”是一系列散列函数的名称;首先是一个短暂的“SHA”,它被重命名为“SHA-0”,然后定义了“SHA-1”(畅销书)。后来又增加了这个家族的新成员,统称为“SHA-2”,由SHA-224、SHA-256、SHA-384和SHA-512组成。最近,设计了新一代 SHA,称为“SHA-3”,也称为“Keccak”(这是一场公开比赛,Keccak 是最终获胜的候选人之一的代号)。
加密散列函数是一个完全定义的、确定性的函数,它不使用密钥。它将任意长度的消息(比特流,任何比特)作为输入,并产生固定大小的输出。输出大小取决于功能;MD5 是 128 位,SHA-1 是 160 位,SHA-256 是 256 位……每个人都可以在给定的输入上计算给定的散列函数,它们都得到相同的结果。散列函数也称为摘要,因为它们以某种方式产生一种输入的“校验和”或“摘要”。健壮的哈希函数必须是这样的,没有人知道如何“反转”它们,甚至没有人知道如何找到两个不同的输入来产生相同的输出。后者称为碰撞并且存在碰撞是数学上的必然性(因为该函数可以接受比产生不同输出更多的不同输入),但我们要求即使找到一个碰撞也是不可行的。
事实证明,MD5 在碰撞方面非常糟糕(我们可以在 PC 上的几秒钟内产生碰撞),而 SHA-0 在这方面也很糟糕;SHA-1 有点不稳定;到目前为止,SHA 家族的其他成员似乎都很强大。哈希函数如何实现抗碰撞有点奇迹,因为整个函数是完全已知的,没有秘密值;它只是将数据混合得太多,以至于最好的密码学家无法解开这个过程。
RSA是两种算法:一种非对称加密算法和一种数字签名算法。尽管这两种算法都建立在相同的数学基础上,但它们却截然不同(很多人将签名描述为“用私钥加密”,这是一个缺陷类比,充其量是令人困惑的,所以不要这样做)。两种算法都使用密钥,即必须保密的数据片段。碰巧的是,对于 RSA 签名,签名的不是直接给定的消息(位序列)而是哈希消息的:首先使用 SHA-256 等加密散列函数处理消息,然后使用散列值。这样做是因为 RSA 的数学只能处理中等大小的值,最多几百位。加密哈希函数使得对哈希进行签名与对原始数据进行签名一样好。
这样,RSA 和加密哈希函数经常一起使用;但它们根本不是一回事。
十六进制是一种将位序列表示为字符序列的方法:十六进制使用从“A”到“F”的数字和字母;每个字符恰好编码四个位('0' 编码'0000','7' 编码'0111','D' 编码'1101'......)。任何位序列(尤其是哈希函数的输出)可以转换为十六进制并返回。十六进制很受欢迎,因为人眼和大脑擅长阅读字符,而不是阅读位。出于这个原因,计算文件上的加密哈希函数的命令行工具传统上会输出十六进制字符。然而,没有任何东西将散列函数与十六进制本质上联系起来:任何适合计算机的东西都是一个位序列,因此适用于十六进制;并且哈希函数输出只是一个位序列,可以以各种方式编码,十六进制只是“传统”方式(尽管也经常遇到Base64,尤其是在处理数据库时)。