密码学 - 哈希函数



密码学中的哈希函数就像一个数学函数,它接收各种输入,例如消息或数据,并将它们转换为固定长度的字符字符串。这意味着哈希函数的输入可以是任意长度,但输出始终是固定长度。这就像将一个大气球压缩成一个紧凑的球。

此过程的重要性在于它为每个输入生成唯一的“指纹”。输入的任何微小更改都会导致指纹发生实质性变化,这种特性称为“抗碰撞性”。

哈希函数在各种安全应用中发挥着至关重要的作用,包括密码存储(哈希值而不是密码)、数字签名和数据完整性检查。哈希值或消息摘要是哈希函数返回的值。哈希函数如下图所示 -

Hash Functions

哈希函数的关键点

  • 哈希函数是数学运算,它们“映射”或更改给定的数据集,将其转换为固定长度的比特字符串,该字符串称为“哈希值”。

  • 哈希函数具有各种复杂性和难度级别,并用于密码学。

  • 加密货币、密码安全和通信安全都使用哈希函数。

密码学哈希函数的操作

在计算机系统中,哈希函数通常用作数据结构,用于信息认证和消息完整性检查等任务。它们不容易被解密,但由于它们可以在多项式时间内解决,因此被认为在密码学上“较弱”。

通过密码学哈希函数,典型的哈希函数得到了改进的安全特性,这使得解密消息内容或收件人和发件人信息变得更加困难。

具体来说,密码学哈希函数显示以下三个特征 -

  • 哈希函数被称为“无冲突”。因此,没有两个输入哈希应该等于相同的输出哈希。

  • 它们是隐藏的。哈希函数的输出应该使根据它推断出输入值变得困难。

  • 它们应该对难题友好。选择产生预定结果的输入需要很困难。因此,输入需要尽可能广泛地获取。

哈希函数的属性

要成为可靠的密码学工具,哈希函数应具有以下属性 -

原像抵抗性

  • 根据此特性,反转哈希函数在计算上应该很困难。

  • 换句话说,如果哈希函数 h 生成哈希值 z,则应难以识别散列到 z 的输入值 x。

  • 此特性可以防御试图仅使用哈希值查找输入的攻击者。

第二原像抵抗性

  • 此属性表明,给定输入及其哈希值,应该很难找到另一个具有相同哈希值的输入。

  • 换句话说,如果输入 x 的哈希函数 h 返回哈希值 h(x),则应该很难找到另一个输入值 y,使得 h(y) 等于 h(x)。

  • 哈希函数的此特性可以防御想要替换原始输入值和哈希的新值的攻击者,但仅持有输入值及其哈希值。

抗碰撞性

  • 此属性表明,应难以识别产生相同哈希值的两个不同长度的输入。此特性也称为无冲突哈希函数。

  • 换句话说,对于哈希函数 h,很难识别两个不同的输入 x 和 y,使得 h(x)=h(y)。

  • 哈希函数不能没有冲突,因为它是一个具有固定哈希长度的压缩函数。无冲突条件仅表示这些冲突应该很难找到。

  • 此特性使得攻击者很难识别具有相同哈希值的两个输入值。

  • 此外,如果哈希函数具有抗碰撞性,则它也具有第二原像抵抗性。

操作效率

  • 对于任何哈希函数 h,给定输入 x 计算 h(x) 可以是一个简单的过程。

  • 哈希函数在计算上比对称加密快得多。

固定输出大小

散列生成特定长度的输出,而不管输入大小如何,并有助于从不同输入大小生成相同大小的输出。

确定性

对于给定的输入,哈希函数始终生成相同的输出,就像一个食谱,当严格遵循时始终产生相同的菜肴。

快速计算

即使对于大量数据集,散列操作也发生得很快。

散列算法的设计

散列本质上涉及一个数学函数,该函数获取两个固定大小的数据块并将它们转换为哈希码。该函数是散列算法的关键部分。这些数据块的长度根据使用的算法而异。通常,它们范围从 128 位到 512 位。下面是一个哈希函数的示例 -

Hash function structure

散列算法使用一系列轮次(类似于分组密码)来处理消息。在每一轮中,使用固定大小的输入,该输入通常结合当前消息块和上一轮的结果。

此过程持续多轮,直到整个消息被散列。下图提供了此过程的视觉表示。

Hash algorithm

由于散列的相互关联性质,其中一个操作的输出会影响下一个操作的输入,因此即使原始消息的微小变化(单个比特差异)也会极大地改变最终的哈希值。

这种现象被称为雪崩效应。此外,区分哈希函数和哈希算法至关重要。哈希函数本身接收两个固定长度的二进制数据块,并生成一个哈希码。

另一方面,哈希算法规定了消息如何划分为块以及如何组合多个哈希操作的结果。

常用的哈希函数

哈希函数在计算中发挥着重要作用,提供了多种功能,例如:快速检索数据、安全保护信息(加密)、确保数据保持不变(完整性验证)。一些常用的哈希函数包括:

消息摘要 (MD)

多年来,MD5 一直是最流行和最常用的哈希函数。

  • 哈希函数 MD2、MD4、MD5 和 MD6 属于 MD 家族。它被采纳为 RFC 1321,互联网标准。它是一个 128 位的哈希函数。

  • 在软件行业,MD5 摘要经常用于确保传输文件的完整性。为了使用户能够将下载文件的校验和与预先计算的 MD5 校验和进行比较,文件服务器通常提供此功能。

  • 2004 年,在 MD5 中发现了碰撞。据称,使用计算机集群进行的分析攻击在不到一小时内就取得了成功。由于 MD5 受到此碰撞攻击的破坏,因此不再建议使用它。

安全哈希函数 (SHA)

构成 SHA 家族的四种 SHA 算法是 SHA-0、SHA-1、SHA-2 和 SHA-3。尽管来自同一个家族,但它们的结构有所不同。

  • 美国国家标准与技术研究院 (NIST) 于 1993 年发布了 160 位哈希算法的第一个版本,称为 SHA-0。它并没有获得广泛的流行,并且存在一些缺点。SHA-1 后来于 1995 年创建,以解决 SHA-0 中的已知缺陷。

  • SHA-1 是现有的 SHA 哈希函数中使用最广泛的一种。它用于大多数应用程序和协议,包括安全套接字层 (SSL) 安全性。

  • 2005 年,发现了一种 SHA-1 碰撞检测技术,可以在现实的时间范围内使用。因此,人们对 SHA-1 的长期可用性表示怀疑。

  • SHA-224、SHA-256、SHA-384 和 SHA-512 是 SHA-2 家族中的另外四种 SHA 变体,它们根据其哈希值中的位数而有所不同。SHA-2 哈希函数尚未成为任何有效攻击的目标。

  • 尽管 SHA-2 是一种强大的哈希函数。虽然差异很大,但其基本设计仍然遵循 SHA-1 的设计。因此,NIST 要求创建新的竞争性哈希函数设计。

  • 2012 年 10 月,NIST 选择 Keccak 算法来替换 SHA-3 标准。Keccak 具有多个优点,包括有效操作和强大的抗攻击能力。

CityHash

CityHash 是另一种非加密哈希函数,旨在快速哈希大量数据。它针对现代处理器进行了优化,并且在 32 位和 64 位架构上都能提供良好的性能。

BLAKE2

BLAKE2 是一种快速且安全的哈希函数,它改进了 SHA-3。它广泛用于加密货币挖掘等需要快速哈希的应用程序。BLAKE2 有两种类型:

  • BLAKE2b - 最适合 64 位计算机,它生成长达 512 位的哈希值。

  • BLAKE2s - 最适合小型计算机(8-32 位),它生成长达 256 位的哈希值。

CRC(循环冗余校验)

CRC(循环冗余校验)是一种用于检测数据传输错误的技术。它涉及在消息末尾添加一个称为校验和的特殊值。此校验和是根据消息内容计算得出的,并在传输过程中包含在内。

接收数据后,接收方将使用相同的方法重新计算校验和。如果新的校验和与原始校验和匹配,则很可能消息已在传输过程中没有错误。虽然 CRC 对错误检测有效,但它不是安全措施。它主要用于确保数据在传输过程中的完整性,而不是保护数据免受未经授权的访问或修改。

MurmurHash

MurmurHash 是一种快速有效的哈希函数,不适用于安全性。它非常适合哈希表等用途,但不适合需要防止碰撞的任务(不同输入产生相同哈希的情况)。

标准长度

哈希涉及使用数学公式将任何大小的数据集转换为更短的、固定长度的输出。

表 I:不同的哈希函数

在表 I 中,消息“CFI”使用三种算法(MD5、SHA-1 和 SHA-256)转换为哈希值。每种算法都会生成一个具有固定长度的唯一输出哈希。MD5 生成一个包含 32 个十六进制字符的哈希,SHA-1 生成一个包含 40 个字符的哈希,SHA-256 生成一个包含 64 个字符的哈希。

输入消息 哈希函数 输出(哈希值)
CFI MD5(128 位,16 字节)32 个字符 3A10 0B15 B943 0B17 11F2 E38F 0593 9A9A
CFI SHA-1(160 位,20 字节)40 个字符 569D C9F0 7B48 7F58 9241 AD4C 5C28 7DA0 A448 8D08
CFI SHA-256(256 位,32 字节)64 个字符 F3ED 0867 48FF 3641 3091 0BB6 6293 7080 2958 B5A2 52AF F364 1FC5 07FD E80D 9929

表 II:使用相同的哈希函数 (SHA-1) 和不同的输入

除了使用的数据(输入)外,哈希函数始终生成具有固定字符数的哈希值。如表 II 所示,输入到相同哈希函数(在本例中为 SHA-1)的不同消息始终生成长度为 40 个十六进制字符的输出值。

输入消息 哈希函数 输出(哈希值)
CFI SHA-1 569D C9F0 7B48 7F58 9241 AD4C 5C28 7DA0 A448 8D08
Corporate FI SHA-1 82C0 5EDC 608F AA08 8EE0 BDD8 8E22 3B38 CA38 82CC
CF Input SHA-1 2013 85FC EEE4 F73D 07F0 4F2A A4CB BOE9 12BF BBB8
CFI 1 SHA-1 C501 23CE 8BB2 A42D 5BB4 4DA7 3FC2 3B3D 62F5 14A5

哈希函数的应用

基于其加密特性,哈希函数有两个直接用途。

密码存储

哈希函数为密码存储提供保护。大多数登录过程不是以明文形式存储密码,而是将密码的哈希值存储在文件中。

密码文件是以 (用户 ID,h(P)) 格式的成对表的格式。

即使攻击者访问了密码文件,他们也只能看到密码的哈希值。由于哈希函数具有原像抵抗性特征,因此他无法使用它来登录或从中获取密码。

数据完整性检查

数据完整性检查(通常使用哈希函数)通过创建校验和来确保数据文件的准确性。此方法允许用户检测对原始文件所做的任何更改。

但是,它不能保证文件的真实性。攻击者可能修改整个文件并生成新的哈希值,然后将其发送给接收者。此完整性检查仅在用户信任文件的原始来源时才有效。

Data Integrity Check

哈希与加密

加密将数据转换为伪装形式,需要使用密码(密钥)对其进行解密和读取。加密和解密是通过密码启用的可逆过程。加密的目的是为了以后解密数据。

哈希将任何大小的数据转换为固定长度的输出。与加密不同,哈希通常是单向函数。反转哈希所需的巨大计算量使得从哈希输出中检索原始数据变得困难。

数据在传输过程中受到加密的保护,这阻止了未经授权的访问。通过将数据与从原始数据创建的唯一指纹(哈希)进行比较,哈希确保了数据的完整性。加密使数据保密,而哈希通过检测任何修改来确保真实性。

广告