SHA-256 详解

发布于:2025-08-19 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、SHA-256 简介

SHA-256 是 SHA-2(Secure Hash Algorithm 2)家族中的一员,由美国国家安全局(NSA)设计,经美国国家标准与技术研究院(NIST)标准化后发布。它是一种密码散列函数,能将任意长度的输入消息转换为固定长度(256 位,即 32 字节)的输出,这个输出被称为消息摘要。

SHA-256 具有单向性和抗碰撞性等重要特性。单向性指从消息摘要难以反推出原始消息;抗碰撞性则意味着很难找到两个不同的消息,使其产生相同的消息摘要。这些特性使得 SHA-256 在数字签名、数据完整性校验、密码存储等领域有着广泛应用,比如在区块链技术中,区块的哈希值计算常采用 SHA-256 算法。

二、算法原理

(一)消息填充

SHA-256 要求输入消息的长度(以比特为单位)最终需满足对 512 取模后余数为 448,若不满足则进行填充。填充过程如下:

  1. 首先在消息末尾添加一个 “1” 比特,无论消息长度如何,这一步是必须的。
  1. 然后添加若干个 “0” 比特,直到消息长度与 448 模 512 同余。
  1. 最后将原始消息的长度(以 64 位二进制数表示)添加到消息末尾。

例如,若原始消息长度为 448 比特,那么先添加 “1” 比特后长度变为 449 比特,此时需要添加 511 个 “0” 比特(449+511=960,960 mod 512=448),再添加 64 位的原始消息长度(448 对应的 64 位二进制数),最终消息长度为 960+64=1024 比特,即 2 个 512 比特的分组。

(二)初始哈希值

SHA-256 有 8 个初始哈希值,这些值源自前 8 个素数(2、3、5、7、11、13、17、19)的平方根的小数部分,取前 32 位二进制数得到,分别为:

  • H0: 0x6a09e667
  • H1: 0xbb67ae85
  • H2: 0x3c6ef372
  • H3: 0xa54ff53a
  • H4: 0x510e527f
  • H5: 0x9b05688c
  • H6: 0x1f83d9ab
  • H7: 0x5be0cd19

(三)常量与函数

  1. 常量 K:SHA-256 有 64 个常量,这些常量来自前 64 个素数的立方根的小数部分,取前 32 位二进制数得到,例如前几个常量为:
    • K0: 0x428a2f98
    • K1: 0x71374491
    • K2: 0xb5c0fbcf
    • K3: 0xe9b5dba5
    • ...
  1. 逻辑函数:SHA-256 中用到多个逻辑函数,用于在处理消息分组时进行运算,主要包括:
    • Ch (x,y,z) = (x & y) ^ (~x & z)(选择函数,根据 x 选择 y 或 z)
    • Maj (x,y,z) = (x & y) ^ (x & z) ^ (y & z)(多数函数,返回 x、y、z 中多数为 1 的位)
    • Σ0 (x) = ROTR2 (x) ^ ROTR13 (x) ^ ROTR22 (x)(大 Sigma0 函数,对 x 进行循环右移操作后异或)
    • Σ1 (x) = ROTR6 (x) ^ ROTR11 (x) ^ ROTR25 (x)(大 Sigma1 函数)
    • σ0 (x) = ROTR7 (x) ^ ROTR18 (x) ^ SHR3 (x)(小 sigma0 函数,包含循环右移和右移)
    • σ1 (x) = ROTR17 (x) ^ ROTR19 (x) ^ SHR10 (x)(小 sigma1 函数)

其中 ROTRn (x) 表示将 x 循环右移 n 位,SHRn (x) 表示将 x 右移 n 位(高位补 0)。

三、算法流程

(一)消息分组

将填充后的消息按照 512 比特为一个分组进行划分,得到 M1, M2, ..., Mn 等若干个分组。

(二)处理每个分组

以其中一个 512 比特的分组 Mi 为例,处理过程如下:

  1. 扩展消息字:将 512 比特的 Mi 分成 16 个 32 比特的字 W0 到 W15,然后通过以下公式扩展生成另外 48 个 32 比特的字 W16 到 W63:

Wi = σ1 (Wi-2) + Wi-7 + σ0 (Wi-15) + Wi-16(其中 “+” 为模 2^32 加法)

  1. 初始化工作变量:将当前的哈希值 H0 到 H7 分别赋值给工作变量 a 到 h,即 a=H0, b=H1, c=H2, d=H3, e=H4, f=H5, g=H6, h=H7。
  1. 64 轮迭代:对于每一轮 t(0≤t≤63),进行如下运算:
    • T1 = h + Σ1(e) + Ch(e,f,g) + Kt + Wt
    • T2 = Σ0(a) + Maj(a,b,c)
    • h = g
    • g = f
    • f = e
    • e = d + T1
    • d = c
    • c = b
    • b = a
    • a = T1 + T2

(所有加法均为模 2^32 加法)

  1. 更新哈希值:迭代结束后,将工作变量 a 到 h 分别与初始哈希值 H0 到 H7 进行模 2^32 加法,得到新的哈希值 H0'=H0+a, H1'=H1+b, ..., H7'=H7+h。

(三)生成最终消息摘要

当所有消息分组都处理完毕后,最终的哈希值 H0 到 H7 连接起来(H0H1H2H3H4H5H6H7)即为 256 比特的消息摘要。

四、示例演示

以消息 “abc” 为例,演示 SHA-256 的计算过程:

  1. 消息填充
    • “abc” 的 ASCII 码为 0x616263,对应的二进制消息为 01100001 01100010 01100011,长度为 24 比特。
    • 首先添加 “1” 比特,得到 01100001 01100010 01100011 1,长度为 25 比特。
    • 需填充到 448 比特,还需添加 448-25=423 个 “0” 比特,此时消息长度为 448 比特。
    • 最后添加原始消息长度 24 的 64 位二进制表示 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00011000,填充后消息总长度为 512 比特,即一个分组。
  1. 消息分组与扩展
    • 将 512 比特的填充消息分成 16 个 32 比特的字 W0 到 W15,其中 W0=0x61626380(“abc” 后补 “1” 和部分 “0” 得到),其余 W1 到 W15 根据填充的 “0” 和长度值确定。
    • 按照扩展公式生成 W16 到 W63。
  1. 迭代与哈希值更新
    • 初始化工作变量 a 到 h 为初始哈希值。
    • 进行 64 轮迭代运算,每一轮按照 T1、T2 的计算方式更新工作变量。
    • 迭代结束后更新哈希值。
  1. 最终结果:“abc” 的 SHA-256 消息摘要为 0xba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad,通常以十六进制字符串表示为 “ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad”。

五、安全性分析

SHA-256 目前仍被认为是安全的哈希算法,尚未出现有效的碰撞攻击方法。其安全性主要依赖于以下几点:

  1. 复杂的消息扩展和迭代过程:通过将消息分组扩展为 64 个字,并进行 64 轮复杂的迭代运算,使得消息的微小变化能被充分扩散到最终的消息摘要中,即 “雪崩效应”—— 原始消息的一个比特变化会导致消息摘要中约一半的比特发生变化。
  1. 精心设计的逻辑函数和常量:逻辑函数具有良好的非线性特性,常量的选取也增加了算法的抗分析能力。

不过,随着计算能力的提升,SHA-256 在未来可能面临挑战,但目前在实际应用中仍被广泛信任,是许多安全协议和系统的重要组成部分。

六、应用场景

  1. 数字签名:发送方用私钥对消息的 SHA-256 摘要进行加密,接收方用公钥解密后得到摘要,再对收到的消息计算 SHA-256 摘要,若两者一致则消息未被篡改且确为发送方发送,例如在比特币交易中,数字签名的生成基于 SHA-256 和椭圆曲线算法。
  1. 数据完整性校验:在文件传输、软件下载等场景中,可预先计算文件的 SHA-256 摘要并公开,用户下载文件后计算摘要,与公开摘要对比,若一致则文件未被篡改,如许多开源软件会提供安装包的 SHA-256 校验值。
  1. 密码存储:系统不会直接存储用户密码,而是存储密码的 SHA-256 摘要,当用户登录时,对输入的密码计算摘要并与存储的摘要对比,避免密码泄露带来的风险(通常还会结合盐值增加安全性)。

七、总结

SHA-256 作为一种重要的密码散列函数,凭借其固定长度输出、单向性和抗碰撞性等特性,在信息安全领域发挥着关键作用。通过消息填充、消息分组扩展、多轮迭代等流程,将任意长度消息转换为 256 位摘要。在实际应用中,它为数字签名、数据完整性校验等提供了可靠的技术支持,了解其算法流程和原理有助于更好地理解其在安全系统中的应用价值。


网站公告

今日签到

点亮在社区的每一天
去签到