行业新闻与博客

密码学中的哈希函数是什么?初学者指南

该加密工具有助于安全身份验证,并确保跨数字通道的数据消息完整性-这是了解什么是散列函数以及其工作原理的知识

什么是四个字母,既是美味的早餐食品,又是具尖叶的植物?如果您猜到“哈希”,那您是对的!但是哈希还具有与密码学有关的另一种含义,这就是我们将在这里讨论的内容。

哈希函数是一个严肃的数学过程,在公共密钥密码学中扮演着至关重要的角色。为什么?因为它可以帮助您:

  • 将密码安全地存储在数据库中,
  • 通过指示何时更改数据来确保数据完整性(在许多不同的应用程序中),
  • 使安全身份验证成为可能,并且
  • 以提高效率的方式组织内容和文件。

您可以找到几乎在所有地方都在使用的哈希函数-从对您在手机上使用的软件应用程序签名到确保用于在线传输敏感信息的网站连接的安全。但是,密码学中的哈希函数是什么?它到底能做什么来帮助您保护企业数据?哈希如何工作?

让我们将其散列出来。

什么是哈希函数?

诸如“哈希函数”之类的术语根据上下文可能对不同的人意味着几件事情。对于密码学中的哈希函数,定义要简单一些。哈希函数是任何给定内容的唯一标识符。这也是 一个过程,它可以接收任何大小的明文数据并将其转换为特定长度的唯一密文。

定义的第一部分告诉您,没有两个内容具有相同的哈希摘要,并且如果内容更改,则哈希摘要也将更改。基本上,哈希是一种确保您发送的任何数据以与您离开时相同的条件到达接收者的方法,该条件是完整无缺的。

但是,等等,这听起来不像加密吗?当然,它们是相似的,但是加密和散列不是同一回事。它们是两个独立的加密功能,有助于促进安全,合法的通信。因此,如果您听到有人在谈论“解密”哈希值,那么您就知道他们不知道他们在说什么,因为首先哈希没有被加密

我们稍后再讨论这两个过程之间的区别。但是现在,让我们继续讲哈希。那么,哈希是什么样的呢?

显示哈希如何工作的哈希函数图形
散列过程如何工作的基本说明。

通过获取纯文本数据输入并使用数学算法生成不可读的输出来简单说明哈希函数的功能。

看起来很简单,对吧?但是哈希函数的作用是使事情变得更加有趣(又复杂)。这是一个很棒的视频,有助于分解散列函数:

那么,如何从技术角度定义哈希呢?哈希函数是一种通用的单向加密算法,可将任何大小的输入映射到固定长度的位的唯一输出。结果输出(称为哈希摘要哈希值哈希码)是我们前面提到的结果唯一标识符

那么,为什么我们将其称为单向函数呢?坦白说,这是因为要强行使用它的计算能力,时间和成本。尝试所有可能导致哈希值的组合都是完全不切实际的。因此,就所有意图和目的而言,哈希函数都是单向函数。

当您对数据进行哈希处理时,所得的摘要通常小于其开头的输入。(这里可能是例外,当您对密码进行哈希处理时。)使用哈希处理时,无论是一句话消息还是整本书,都没关系-结果仍然是固定长度的位(1 和 0s)。这样可以防止意外的参与者弄清楚原始输入消息有多大(或小)。

哈希函数主要用于身份验证,但还有其他用途。

强哈希算法的性质

那么,是什么导致了强大的哈希算法呢?所有优秀的人都有一些关键特征:

  • 确定性-哈希算法应该是确定性的,这意味着无论您开始使用的输入大小如何,它始终会为您提供相同大小的输出。这意味着,如果您要对单个句子进行哈希处理,则结果输出的大小应与对整本书进行哈希处理时得到的输出大小相同。
  • 图像前抵抗力—这里的想法是,强大的哈希算法是图像前抵抗力的一种,这意味着反转哈希值以恢复原始输入的纯文本消息是不可行的。因此,哈希的概念是不可逆的单向函数。
  • 防碰撞—两个对象碰撞时发生碰撞。好吧,这个概念在带有哈希值的密码学中得以延续。如果两个唯一的输入数据样本产生相同的输出,则称为冲突。这是个坏消息,这意味着您用于散列数据的算法已损坏,因此不安全。基本上,这里的关注点在于,有人可能会创建一个具有与真实(安全)文件相匹配的人工哈希值的恶意文件,并将其作为真实事物传递出去,因为签名会匹配。因此,一种良好且值得信赖的哈希算法可以抵御这些冲突。
  • 雪崩效应-这意味着对输入的任何更改(无论大小如何)都将导致输出的巨大变化。从本质上讲,一个很小的变化(例如添加逗号)会滚雪球,变成更大的东西,因此称为“雪崩效应”。
  • 哈希速度-哈希算法应以合理的速度运行。在许多情况下,散列算法应快速计算散列值。这被认为是加密哈希函数的理想属性。但是,此属性更具主观性。您会看到,更快并不总是更好,因为速度应取决于哈希算法的使用方式。有时,您需要更快的哈希算法,而在其他情况下,最好使用较慢的哈希算法,该算法需要花费更多的时间来运行。前者更适合网站连接,而后者更适合密码哈希。

哈希函数有什么作用?

密码学中哈希函数的一个目的是采用纯文本输入,并以不可逆的方式生成特定大小的哈希值输出。但是从 10,000 英尺的角度来看,它们的作用远不止这些。您会发现,哈希函数在密码学领域往往会戴上帽子。简而言之,强大的哈希函数:

  • 确保数据完整性,
  • 防止未经授权的修改,
  • 保护存储的密码,以及
  • 以不同的速度运行以适应不同的目的。

确保数据完整性

散列函数是确保公钥加密中数据完整性的一种方法。我的意思是,散列函数用作校验和,或者是某人标识数据后是否对其进行篡改的一种方式。它还用作身份验证的手段。

例如,假设您已登录公共 Wi-Fi 向我发送电子邮件。(顺便说一句,不要这样做。这是非常不安全的。)因此,您写出消息,使用数字证书进行签名,然后通过互联网进行发送。这就是您所说的主要中间人攻击区域,这意味着某人可以轻松拦截您的消息(再次,因为众所周知的公共无线网络不安全),并对其进行修改以适合其邪恶目的。

上面的示例是经过 MitM 攻击在传输过程中被操纵的经过数字签名的电子邮件。当对任何电子邮件内容进行数字签名后对其进行修改时,哈希摘要将完全更改,表明该电子邮件摘要不可信任。

因此,现在我收到了消息,并且想知道它是合法的。然后,我可以做的是使用您的数字签名提供的哈希值(以及它告诉我的算法)来重新生成哈希值,以验证我创建的哈希值是否与您发送的哈希值匹配。如果匹配,那就太好了,这意味着没有人将其弄乱。但是,如果不是这样,那么……隐喻的喇叭声响起,红旗升起,我知道不信任它。

即使消息中的细微变化-您将字母大写而不是使用小写字母,或者在有句点的地方交换感叹号-这将导致生成一个全新的哈希值。但这就是这里的全部想法–无论更改有多大或多小,哈希值的差异都会告诉您这是不合法的。  

防止未经授权的修改

加密哈希函数的最佳方面之一是,它可以帮助您确保数据完整性。但是,如果您将哈希应用于数据,是否意味着该消息无法更改?否。但是它的作用是通知邮件收件人邮件已更改。这是因为即使对消息进行的最小更改也将导致创建全新的哈希值。

想想哈希就像是烟雾报警器。尽管烟雾报警器并没有阻止火灾的发生,但它确实让您知道,在为时已晚之前有危险。

使您能够验证和安全存储密码

如今,许多网站都允许您存储密码,因此您不必每次登录时都记住它们。但是将此类纯文本密码存储在面向公众的服务器中将很危险,因为这样会使信息容易受到网络犯罪分子的攻击。 。因此,网站通常要做的是使用哈希密码来生成哈希值,而不是它们存储的值。

但是,仅凭密码散列还不足以保护您免受某些类型的攻击,包括蛮力攻击。这就是为什么您首先需要添加盐的原因。一个是之前他们混编套用至明文口令一个独特的,随机数。这提供了额外的安全性,并且可以保护密码免受诸如彩虹表攻击之类的密码破解方法的侵害。(请注意接下来几周我们关于彩虹表的未来文章。)

以不同的速度运转,以适应不同的目的

同样重要的是要注意,散列函数并不是一刀切的所有工具。如前所述,不同的散列函数根据其设计和散列速度而具有不同的用途。它们以不同的运行速度工作-有些速度更快,而另一些则慢得多。这些速度可以帮助或阻止哈希算法的安全性,具体取决于您的使用方式。因此,有些属于安全哈希算法,而有些则没有。

建立与网站的安全连接时,您想在其中使用快速哈希算法的示例。这是速度更快时的一个示例,因为它有助于提供更好的用户体验。但是,如果您试图使网站能够为客户存储密码,那么您肯定要使用慢速哈希算法。从规模上讲,这将需要密码破解攻击(例如暴力破解),这会占用更多时间并为网络犯罪分子提供计算资源。您不想让他们变得容易,对吗?

在哪里可以找到哈希值

但是在哪里可以找到哈希函数?环顾四周,便是无与伦比的技术。从签名新软件和验证数字签名到保护计算机和移动 Web 浏览器中的网站连接,哈希对所有方面都很有用。它对于索引和检索在线数据库中的项目也非常有用。例如,哈希用于验证:

  • 加密货币和其他区块链技术中的数据块。
  • 软件,电子邮件和文档的数据完整性。
  • 联机数据库中的密码和存储密码哈希(而不是密码本身)。(注意:此过程需要一些特殊的“破折号”,以使这些哈希更安全-一种盐)。

哈希函数可以在整个公钥加密中找到。例如,您会发现通过使用以下方法可以促进哈希函数的使用:

  • SSL / TLS 证书(即网站安全证书),
  • 代码签名证书,
  • 文件签署证书,
  • 电子邮件签名证书。

散列如何工作?

散列消息时,您将任意大小的数据字符串作为输入,并通过数学算法运行该算法,从而生成固定长度的输出。

在某些散列方法中,原始数据输入被分解为相等大小的较小块。如果在任何块中没有足够的数据来使大小相同,则可以使用填充(1 和 0)填充数据。然后,通过散列算法运行这些单独的数据块,并输出散列值。该过程如下所示:

散列函数图,说明了散列的工作方式
关于哈希如何工作的另一个更深入的说明。

当然,如果您要哈希密码以存储在在线服务器中,则此过程看起来会有所不同。该过程将涉及使用盐。基本上,您将在通过哈希算法运行消息之前,向消息添加一个唯一的随机值。通过仅添加一个字符,您就可以在过程结束时获得全新的哈希值。

使用不同算法散列示例

好的,现在我们知道了哈希函数是什么,以及它在理论上的作用是什么,让我们通过一些示例来考虑它在逻辑上的工作方式。比方说,你有以下的咕噜谜中霍比特人作为输入:

“看不见,感觉不到,
听不到,不能闻到。
它躺在星星后面和山丘下,
并且填补了空洞。
它首先出现,之后出现,结束生命,消除
笑声。”

不,如果您还没有找到答案,我不会给您答案。但是,如果您要通过 SHA-256 哈希算法运行该谜语,那么在屏幕上显示的结果将是这样的:

49FCA16A2271B34066DAA46492C226C4D4F61D56452A1E1A01A3201B234509A2

这是说明我们如何从 A 到达 B 的示意图:

基本的哈希函数图形,该图形说明了如何通过哈希算法运行输入,并导致创建哈希摘要输出
作为散列算法如何获取输入并生成固定长度的唯一十六进制输出的简单说明。

如果您还决定哈希较小的消息怎么办?例如说“指环王”。然后,只要您使用相同的哈希算法,您的输出在大小上就会看起来相同(如下所示):

01912B8E8425CFF006F430C15DBC4991F1799401F7B6BEB0633E56529FE148B9

这是因为两个示例字符串均为 256 位,每个字符串在屏幕上显示为 64 个十六进制字符。无论消息多大或多小,它总是会返回相同大小的输出。请记住,哈希算法是确定性的,因此这意味着无论输入大小如何,它们始终会产生相同大小的输出。

现在,如果您要使用相同的六行谜语输入并通过 MD5 哈希函数运行它,那么您将得到一个看起来像这样的哈希值:

B53CE8A3139752B10AAE878A15216598

如您所见,输出要短得多。这是因为 MD5 会为您提供仅 32 个十六进制字符的哈希摘要。实际上,这只是 SHA-256 哈希算法产生的摘要的一半。但是每次在纯文本消息上运行 MD5 哈希算法时,结果输出将具有相同的大小。

如果您决定通过 SHA-512 哈希算法运行谜题怎么办?然后,就长度而言,我们走到频谱的另一端,您的摘要看起来像这样(一个 512 位十六进制字符串):

6DC1AAE5D80E8F72E5AF3E88A5C0FA8A71604739D4C0618182303EEEB1F02A0DBA319987D5B5F717E771B9DA1EAD7F3F92DC8BA48C064D41DD790D69D7D98B44

哈希与加密

但是,哈希和加密不是一回事吗?不。是的,它们都是使用算法作为其过程一部分的加密功能。但这就是相似之处结束的地方。在另一篇文章中,我们讨论了散列和加密之间的差异,因此在这里我们将不重新讨论所有这些。

您现在知道,哈希函数单向函数。这个想法是,您可以使用它将可读的纯文本数据转换为不可读的十六进制数字字符串,但不能反过来。另一方面,加密被称为双向功能。这是因为能够加密某些内容的全部目的是为了防止未经授权或无意的一方访问数据。因此,您对数据进行加密,以便只有拥有密钥的人才能解密数据。

常见哈希算法和算法族的示例

好的,我们现在知道什么是哈希函数以及哈希算法如何工作。现在该学习一些最常见的哈希算法了。NIST 与一些联邦信息处理标准(FIPS)一样,提供了有关散列函数的指南。

常见哈希算法的一些示例包括:

  • 安全哈希算法(SHA) -此哈希系列包含 SHA-1,SHA-2(一个系列中的一个系列,其中包括 SHA-224,SHA-256,SHA-384 和 SHA-512)和 SHA-3( SHA3-224,SHA3-256,SHA3-384 和 SHA3-512)。SHA-1 已过时,现在最常用的哈希算法是 SHA-256。
  • 消息摘要(Message Digest,MD) -此哈希系列包含各种哈希函数,包括 MD2,MD4,MD5 和 MD6。长期以来,MD5 一直被认为是一种哈希算法,但现在却被认为是坏算法,因为它会导致野外冲突。
  • Windows NTHash-也称为 Unicode 哈希或 NTLM,该哈希在 Windows 系统中通常使用,因为它比其前身 LM 哈希更安全。但是,NTHash 也仍然有漏洞需要担心,但是此特定算法是 Windows 系统不可或缺的。如今,NTLMv1 的使用已不多了,但 NTLM2 仍在使用中。

哈希算法的其他示例包括 BLAKE 2 和 BLAKE 3,RIPEMD-160 和 WHIRLPOOL 等。

我们浪费了什么(TL; DR)

通常,关于哈希函数和哈希有很多知识。它们是什么,它们做什么,它们如何操作以及在计算机通信和技术中可以找到它们的地方。

  • 在索引和检索数据集项目的数据结构中,散列很有用。它还可以通过检测修改来进行验证。
  • 在密码学中,散列采用纯文本数据(输入)并通过称为散列算法的数学过程运行。此过程将生成固定长度的输出,称为哈希值。
  • 哈希函数是确定性的,这意味着,不管输入的大小如何,输出将始终是相同大小。它也具有防碰撞防原像的功能
    • 耐碰撞性意味着您不能有两个唯一的输入导致相同的输出,并且
    • 图像前阻力是指哈希是一种单向函数,不能逆转以显示原始明文消息。
  • 在不完全更改结果哈希值的情况下,您无法操作数据甚至进行很小的更改。这被称为雪崩效应
  • 不同的哈希算法(其中有许多系列和单独的算法)以不同的速度运行并处理不同大小的数据。例如,SHA-256 的输出为 256 位(或等于 64 个十六进制字符的字符串)。

需要帮助吗?联系我们的支持团队 在线客服