“校验和”算法和“哈希”函数之间有什么异同?
它们可以互相代替使用吗?还是它们的用法不同?
例如,为了验证文本的完整性,使用哪个更好?
如果它们不同,那么每种算法的具体算法是什么?这意味着哪种算法适用于 “校验和”,哪种算法适用于“哈希”函数?
“校验和”算法和“哈希”函数之间有什么异同?
它们可以互相代替使用吗?还是它们的用法不同?
例如,为了验证文本的完整性,使用哪个更好?
如果它们不同,那么每种算法的具体算法是什么?这意味着哪种算法适用于 “校验和”,哪种算法适用于“哈希”函数?
校验和(例如 CRC32)是为了防止意外更改。如果一个字节改变,校验和改变。校验和不能安全地防止恶意更改:创建具有特定校验和的文件非常容易。
哈希函数将一些数据映射到其他数据。它通常用于加速比较或创建哈希表。并非所有散列函数都是安全的,并且散列不一定会在数据更改时更改。
加密散列函数(如 SHA1)是一种校验和,可防止恶意更改。创建具有特定加密哈希的文件非常困难。
为了使事情变得更复杂,密码散列函数有时简称为散列函数。
“校验和”算法和“哈希”函数之间有什么异同?
校验和用于确定某事是否相同。
如果您下载了一个文件,您永远无法确定它是否在您的机器上被损坏了。您可以使用cksum
来计算您现在拥有的副本的校验和(基于 CRC-32),然后可以将其与文件应具有的校验和进行比较。这是您检查文件完整性的方式。
哈希函数用于将数据映射到其他固定大小的数据。完美的散列函数是单射的,因此没有冲突。每个输入都有一个固定输出。
加密散列函数用于验证。使用加密哈希函数,您应该无法计算原始输入。
一个非常常见的用例是密码哈希。这允许验证密码而无需保存密码本身。服务提供商仅保存密码的哈希值,无法计算原始密码。如果密码哈希数据库遭到破坏,攻击者也应该无法计算这些密码。情况并非如此,因为密码散列有强算法和弱算法。您可以在此站点上找到更多相关信息。
TL;博士:
校验和用于比较两条信息,以检查两方是否具有完全相同的东西。
哈希(在密码学中)用于验证某些东西,但这一次,故意只有一方可以访问必须验证的数据,而另一方只能访问哈希。
它们基本上是一样的,但校验和往往更小(几个字节)。
正直
散列函数和校验和都用于验证数据的完整性。加密散列函数是冲突未知的散列函数。这就是为什么使用加密散列函数来构造诸如 MAC 之类的东西(见下文)。
信息丢失
散列函数和校验和的另一个特性是信息在计算过程中会丢失。如果您将某些数据转换为具有较少位的校验和/哈希,则必须如此。这也是为什么您不能仅使用校验和或哈希返回原始数据的原因。
HMAC
我认为您正在寻找的是 MAC(消息验证码)。这样的代码用于检测数据的篡改。大多数时候,它只是散列函数和一些秘密值的组合,比如密码。也可以看看:
https://en.wikipedia.org/wiki/Message_authentication_code
密码
密码有时存储为散列。为了验证密码,系统会计算您输入的密码的哈希值,并将其与存储的密码哈希值进行比较。校验和不用于此类事情,因为它们通常更短且更容易发生冲突,这意味着您可以尝试随机密码并有机会输入与原始密码相同的校验和。
但请注意,使用普通(摘要)哈希函数不是存储密码的正确方法。因为它们是为快速消化数据而创建的,所以攻击者可以高速破解这些哈希值。程序员应该使用为存储密码而设计的散列函数,例如 bcrypt 或 Argon2。
编辑:算法示例
要回答有关特定算法的最后一个问题:请查看列出哈希函数的 Wikipedia 页面。就像我上面提到的,它们基本上是相同的。在 Wikipedia 上,校验和被列为哈希函数的子集。
让我在上面添加两个实际示例。
校验和:这些旨在检测数据的意外变化。一个很好的例子是TCP/IP 中使用的校验和。它们简单且非常快速(检查每个数据包)。恶意制作校验和等于另一个校验和的消息相对简单。
哈希:这些是用于将数据映射到固定长度的单向函数。它们通常用于比较大量数据,而无需通过网络发送。BitTorrent就是一个很好的例子。下载完成后,它会通过计算哈希值并匹配这些数据,将您的数据版本与原始数据进行比较。
“校验和”算法和“哈希”函数之间有什么异同?
类似地,它们都是确定性的,可以将可变大小的数据映射到固定大小。它们都可以用来检查相同性,尽管有不同的保证。有关差异,请参见上文。
它们可以互相代替使用吗?还是它们的用法不同?
他们不应该。往上看。
例如,为了验证文本的完整性,使用哪个更好?
这取决于你想做什么。该行业使用两者来检查“完整性”(参见上面的示例)。
有关数据完整性的简要介绍,请阅读本文。