哈希简介

1,101 阅读16分钟

1. SHA-1

  • 概述:SHA-1(Secure Hash Algorithm 1)是一个较早的加密哈希函数,它生成160位(20字节)的哈希值。

  • 优点

    • 计算速度较快,适用于低性能设备。
    • 在一些旧的协议和系统中仍然得到广泛应用(例如数字签名、证书等)。
  • 缺点

    • 存在碰撞漏洞(攻击者能够找到两个不同的输入产生相同的哈希值),因此被认为不再安全。
    • 近年来,SHA-1在密码学上逐渐被淘汰,特别是在TLS、SSL和加密证书中。
  • 为什么被淘汰

    • SHA-1在理论和实践中被发现有较强的碰撞攻击(如Google和CWI研究人员在2017年演示的SHA-1碰撞攻击)。因此,现在已经不再推荐使用。
  • 应用场景

    • 早期的数字签名和证书(虽然现在被逐步替换为SHA-256和SHA-3等更安全的哈希算法)。

2. SHA-256

  • 概述:SHA-256属于SHA-2(Secure Hash Algorithm 2)家族,生成256位(32字节)的哈希值,是最常用的哈希算法之一,广泛应用于区块链、数字签名和各种安全协议中。

  • 优点

    • 高安全性:相较于SHA-1,它更抗碰撞且计算复杂度较高。
    • 已被广泛应用和审计,且不易被破解。
  • 缺点

    • 计算上较为复杂,较慢,但在现代硬件上仍然是高效的。
  • 应用场景

    • 比特币及其他区块链应用。
    • 数字签名、文件完整性校验等。

3. SHA-512

  • 概述:SHA-512也是SHA-2家族的一部分,生成512位(64字节)的哈希值。它与SHA-256非常相似,只不过它的输出长度和安全性更高。

  • 优点

    • 更强的安全性(生成的哈希值较长),难以受到碰撞攻击。
    • 对于64位系统,SHA-512的性能可能优于SHA-256,尤其是使用较长输入时。
  • 缺点

    • 输出的哈希值较长,占用更多存储空间。
    • 计算速度比SHA-256稍慢,尤其在32位系统上性能表现较差。
  • 应用场景

    • 对数据完整性和安全性要求较高的场景。
    • 适用于需要更高安全性的场景(如数字签名、密码学应用)。
  • 为什么较少使用

    • 虽然SHA-512安全性更高,但在大多数应用中,SHA-256已足够满足要求。SHA-256提供了合理的安全性与计算效率平衡,而SHA-512由于其较大的哈希值和相对较低的兼容性,使用较少。

4. MD5 (Message Digest Algorithm 5)

  • 概述:MD5生成128位(16字节)的哈希值,广泛用于早期的校验和验证。

  • 优点

    • 计算速度极快,适用于低计算能力的设备。
    • 简单易用,历史上广泛应用于文件校验和数字签名。
  • 缺点

    • 存在碰撞漏洞(例如,研究人员已经能够找到不同的输入生成相同的MD5哈希),因此已被视为不安全。
    • 不适用于要求高安全性的应用(如数字签名和加密证书等)。
  • 为什么不推荐

    • MD5的安全性较差,已被很多标准和协议弃用。
    • 尽管其速度快,但由于可以被暴力破解或产生碰撞,已经不再适用于需要安全性的场合。
  • 应用场景

    • 文件校验(如某些旧版的文件验证、校验和)。
    • 历史上在一些低安全性要求的场合中应用过。

5. BLAKE2

  • 概述:BLAKE2是一种较新的哈希算法,旨在提供比SHA-256更高的速度,同时仍保持较高的安全性。BLAKE2有两个版本:BLAKE2b(用于较长输出)和BLAKE2s(用于较短输出)。

  • 优点

    • 计算速度非常快,设计上优化了硬件加速。
    • 提供了较高的安全性,同时避免了SHA-2的一些性能瓶颈。
    • 更短的输出(例如BLAKE2s)适合嵌入式和移动设备。
  • 缺点

    • 虽然较新的哈希算法,但其采用程度较低,尚未被广泛采纳。
  • 应用场景

    • 适用于对速度要求较高同时需要较高安全性的场景。
    • 一些现代加密库和协议(例如某些密码学应用和文件校验)。

6. Whirlpool

  • 概述:Whirlpool是一种基于Merkle-Damgård构造的哈希算法,生成512位(64字节)的哈希值。

  • 优点

    • 安全性较高,生成较长的哈希值(512位)。
    • 设计较为复杂,防止了许多已知的哈希攻击。
  • 缺点

    • 计算复杂度较高,速度较慢,适用范围较小。
    • 相较于SHA-256和SHA-512,其应用较为局限,支持度不如其他算法广泛。
  • 应用场景

    • 针对要求极高安全性的场景,但因为较慢的计算速度而不常用。

7. RIPEMD-160

  • 概述:RIPEMD-160是一种哈希算法,生成160位(20字节)的哈希值,较少用于现代应用。

  • 优点

    • 安全性较好,但没有SHA-256那样的广泛支持。
    • 输出长度适中,适合某些低资源环境。
  • 缺点

    • 安全性相较于SHA-256较低,尽管它仍然被认为是抗碰撞的,但已不推荐用于高安全性应用。
    • 使用较少,兼容性差。
  • 应用场景

    • 某些特定领域的哈希需求,但不适用于高安全性要求的应用。

总结:为什么没有SHA-512的普及

虽然SHA-512提供了更高的安全性,但SHA-256在大多数应用中已经提供了足够的安全性。SHA-512生成的哈希值较长(64字节),这在存储和传输上会占用更多资源。对于绝大多数场景,SHA-256足以应对碰撞和预映像攻击等问题,并且具有良好的计算效率,因此在实际应用中更为常见。

  • SHA-256 更加平衡,适用于大多数应用场景。
  • SHA-512 安全性更高,但在一些情况下,计算上稍显笨重,因此应用较少。

选择哈希算法时,通常会权衡安全性、性能以及具体应用的需求。如果应用场景对安全性有极高要求,且不在意计算的开销,SHA-512或更强的哈希算法(如BLAKE2、Whirlpool)可能更合适。如果需要兼容性和广泛的支持,SHA-256则是更常见的选择。

SHA-3 (Secure Hash Algorithm 3) 是 SHA 系列中的最新成员,与 SHA-2(包括 SHA-256 和 SHA-512)有所不同,具有独特的设计和算法结构。它于2015年由 美国国家标准与技术研究院(NIST) 发布,并被纳入为 FIPS PUB 202 标准。

SHA-3 是在 Keccak 算法基础上设计的,Keccak 之前曾赢得了 NIST 的哈希算法标准竞赛,成为了SHA-3的核心。

SHA-3的主要特征

  • 构造方法:SHA-3 使用了 海绵构造(Sponge Construction) ,与SHA-2的Merkle-Damgård构造不同。海绵构造使得SHA-3具备了非常强的抗碰撞性和灵活性。
  • 可变输出长度:SHA-3不仅支持固定长度的哈希值,还允许输出任意长度的哈希值,这让它能够灵活地适应不同的应用场景。

SHA-3家族成员

SHA-3算法族包括多个变种,分别有不同的输出长度:

  • SHA3-224:生成224位(28字节)的哈希值。
  • SHA3-256:生成256位(32字节)的哈希值,类似于SHA-256,但使用了不同的算法结构。
  • SHA3-384:生成384位(48字节)的哈希值。
  • SHA3-512:生成512位(64字节)的哈希值,类似于SHA-512,但使用了不同的算法结构。
  • SHAKE128:可调输出长度的哈希函数,使用128位的输出值,适用于需要较短输出的场景。
  • SHAKE256:可调输出长度的哈希函数,使用256位的输出值,适用于需要较长输出的场景。

SHA-3与SHA-2的区别

特性SHA-2SHA-3
构造方法Merkle-Damgård构造海绵构造(Sponge Construction)
输出长度固定长度(如SHA-256为256位)固定长度或可变长度
安全性目前安全,但不如SHA-3强设计更强的抗碰撞能力,抗碰撞性更高
应用比特币、TLS等广泛应用用于未来高安全性需求的应用

SHA-3的优缺点

优点

  1. 强抗碰撞性

    • SHA-3的海绵构造相较于SHA-2更为抗碰撞,能有效避免与SHA-2相似算法的弱点。
  2. 灵活的输出长度

    • 通过SHAKE系列算法,SHA-3能够生成不同长度的哈希值,从而在很多特定场合(如密码学应用、哈希表等)具有更大的灵活性。
  3. 抗量子计算攻击

    • 虽然目前尚未完全解决量子计算威胁,但SHA-3的设计比SHA-2更具抗量子计算的潜力,可能在未来的量子时代中表现更好。
  4. 不同的结构

    • SHA-3采用海绵结构,而不是SHA-2的Merkle-Damgård结构,这使得它在理论上更加具有稳定性。

缺点

  1. 计算效率较低

    • 相较于SHA-2,SHA-3的计算速度较慢。它的性能在硬件实现上可能不如SHA-2高效,尤其是在早期的硬件上。
  2. 采用较少

    • 由于SHA-3是一个较新的标准,当前在实际应用中还没有被广泛采纳。SHA-2依然在很多地方占据主导地位(例如在TLS、SSL、区块链等领域)。
  3. 较大的输出值

    • 由于SHA-3生成的哈希值长度较长(尤其是SHA3-512),它在存储和带宽需求上可能会显得有些“过度”,对于某些需要小型哈希的应用场景,可能不太合适。

SHA-3应用场景

  • 数字签名和身份验证

    • 在需要高安全性和抗碰撞的场景中,SHA-3比SHA-2更合适。
  • 密码学应用

    • SHA-3适用于在加密协议和应用中用作哈希函数,尤其是在考虑未来量子计算威胁时,它可能会提供更强的保护。
  • 区块链

    • 在一些新兴区块链项目中,SHA-3作为比SHA-2更强的哈希算法,可能会成为未来的主流选择。
  • 文件完整性和哈希表

    • 由于SHA-3能够提供灵活的输出长度,它也适用于文件完整性校验和哈希表等应用。

SHA-3的实际使用

尽管SHA-3在理论上具有许多优点,但由于SHA-2仍然非常强大并且在广泛的应用中表现良好,因此SHA-3的采用并不像SHA-2那样广泛。SHA-3主要用于一些高安全性需求或对现有标准不满意的领域。

SHA-3的实际使用示例(Python代码)

python
复制代码
import hashlib

# SHA3-256 哈希
data = "Hello, SHA-3!".encode('utf-8')
hash_obj = hashlib.sha3_256(data)
print("SHA3-256 Hash:", hash_obj.hexdigest())

# SHAKE256 可变长度哈希(例如输出128位的哈希值)
shake_obj = hashlib.shake_256(data)
shake_hash = shake_obj.hexdigest(32)  # 输出128位
print("SHAKE256 Hash (128 bits):", shake_hash)

总结

SHA-3作为一种新型哈希算法,采用了海绵构造,具有更强的抗碰撞性和灵活性,特别适用于需要高安全性或抗量子计算的场景。虽然目前SHA-2仍然是最常用的哈希算法,但随着对更强安全性的需求增加,SHA-3将在未来逐步得到更多应用。

海绵构造(Sponge Construction)Merkle-Damgård构造 是两种用于设计加密哈希函数的基本方法,它们在安全性、性能和适用性上有显著的差异。下面我们将详细介绍这两种构造方法。

1. Merkle-Damgård 构造

Merkle-Damgård构造是最早的加密哈希算法结构之一,它广泛用于SHA系列(如SHA-1、SHA-2)和MD系列(如MD5)。这种结构由 Ralph MerkleIvan Damgård 独立提出,并被广泛应用于加密领域。

Merkle-Damgård 构造的工作原理

Merkle-Damgård构造的基本思想是将输入数据分块,并通过一个单向函数(通常是迭代的哈希算法)进行处理。

  1. 填充(Padding)

    • 首先,输入消息被填充至一定的长度,使得其长度是固定的块大小的倍数。填充过程包括在消息后添加“1”比特,然后根据需要补充“0”比特。
    • 填充的目的是确保消息长度与哈希函数的处理块大小兼容。
  2. 分块处理

    • 将填充后的消息分成固定长度的块,逐个块地处理。
    • 每个块与上一个块的输出(初始值为一个常量,比如哈希函数的初始向量IV)通过单向哈希函数(如MD5、SHA-1等)进行处理。
  3. 迭代计算

    • 每个块通过哈希函数计算后,与前一个计算结果(哈希值)结合,得到新的哈希值。这个过程反复进行,直到所有的消息块都被处理。
  4. 输出

    • 最终的输出是最后一个迭代的结果,通常称为“哈希值”或“摘要”。

Merkle-Damgård 构造的优缺点

  • 优点

    • 简单易实现,具有良好的数学理论基础。
    • 适用于基于“块处理”的哈希函数,可以高效地在硬件和软件中实现。
    • 通过增加内存和迭代次数,可以提高其安全性。
  • 缺点

    • 长度扩展攻击(Length Extension Attack) :由于这种结构的设计,攻击者可以利用已知的哈希值和消息的一部分(比如原文数据)来扩展消息,而不需要知道原始消息。这个攻击漏洞在SHA-1和MD5中尤为明显。
    • 不支持可变输出长度:Merkle-Damgård构造通常会生成固定长度的输出,这对于某些应用场景可能会不适应。
  • 应用

    • 被广泛用于SHA-1、SHA-2、MD5等哈希算法。

示意图

rust
复制代码
消息 --> 填充 --> 分块 --> 迭代计算 --> 哈希输出

2. 海绵构造(Sponge Construction)

海绵构造是一种更为现代化的哈希函数设计方法,特别用于SHA-3(Keccak)的设计。与Merkle-Damgård构造不同,海绵构造具有更强的安全性和灵活性,尤其在抗碰撞性和灵活输出方面有显著优势。

海绵构造的工作原理

海绵构造基于 状态(State)吸收(Absorbing)压缩(Squeezing) 过程,通过多次的状态转换来处理输入和生成输出。

  1. 状态初始化

    • 海绵构造定义了一个固定大小的状态(通常为 f 位)。这个状态是哈希计算的核心。
    • 状态初始化为一个零向量(或者一些其他的初始值)。
  2. 吸收(Absorbing)过程

    • 将消息分成块,每块通过异或操作(XOR)与当前状态的前部分结合,更新状态。
    • 这一步通过多次的 “吸收” 操作将输入数据“吸入”到状态中,每次吸收一个消息块。
  3. 压缩(Squeezing)过程

    • 一旦所有消息块都吸收到状态中,海绵构造开始通过“压缩”过程提取出哈希值。
    • 状态的“输出部分”会被提取作为哈希值的输出,并且输出可以是可变长度(比如SHAKE系列的输出长度可调)。
  4. 重复吸收与压缩

    • 如果需要更多的输出,可以继续提取状态中的数据并压缩,直到输出满足需要的长度。

海绵构造的优缺点

  • 优点

    1. 灵活性

      • 海绵构造可以生成固定长度或可变长度的哈希输出,适应性非常强,能够满足不同应用的需求。
      • 比如,SHAKE256可以通过指定长度输出任意位数的哈希值,适用于需要短哈希的场合。
    2. 抗碰撞性强

      • 海绵构造避免了Merkle-Damgård的长度扩展攻击,提供了更强的安全性。由于其设计与输出依赖于整个输入的处理,它更难受到攻击。
    3. 不容易受到长度扩展攻击

      • 由于海绵构造的设计方式,攻击者不能轻易通过已知的哈希值和一部分消息来修改哈希输出,这避免了Merkle-Damgård构造的漏洞。
  • 缺点

    1. 较高的计算开销

      • 海绵构造的设计在处理大量数据时,相较于Merkle-Damgård构造的计算效率可能稍低一些。
    2. 更复杂的实现

      • 相对于Merkle-Damgård构造,海绵构造的算法更为复杂,尤其在硬件实现上可能不如简单的哈希算法那样高效。
    3. 较少的普及度

      • 尽管海绵构造在理论上具有强大的优势,但由于SHA-2的广泛使用,SHA-3和海绵构造目前在实际应用中的普及度较低。
  • 应用

    • 主要用于SHA-3(Keccak)和一些基于Keccak的密码学应用(如BLAKE2)。
    • 由于其灵活的输出,适用于各种密码学协议和高安全性要求的场景。

示意图

rust
复制代码
状态初始化 --> 吸收数据 --> 压缩输出 --> 生成哈希值

Merkle-Damgård vs 海绵构造

特性Merkle-Damgård海绵构造(Sponge Construction)
输出长度固定长度,不能灵活调整可变输出长度
抗长度扩展攻击容易受到长度扩展攻击强防长度扩展攻击
设计结构基于迭代处理,每个消息块依赖前一个哈希值基于状态转换,处理所有输入后输出哈希值
安全性随着理论研究发现漏洞,如碰撞攻击设计更强,抗碰撞性和扩展性更好
计算效率高效,但在安全性提高时可能性能下降理论上较慢,但设计灵活,可以适应不同需求
应用SHA-1、SHA-2、MD5等SHA-3(Keccak)、BLAKE2等

总结

  • Merkle-Damgård 构造简单且计算效率较高,但它容易受到 长度扩展攻击,并且输出长度固定,不适应某些特定场景。
  • 海绵构造 提供了更强的 抗碰撞性灵活性,能够根据需要生成任意长度的输出,且不受长度扩展攻击的影响,是 SHA-3 和其他现代哈希算法的核心,但实现上较为复杂,计算上也可能稍慢。

两种结构各有优缺点,选择使用哪种结构通常取决于具体的应用场景、安全需求和计算效率要求。