哈希算法

哈希算法(Hash 算法)

又称散列算法,核心:任意长度输入 → 固定长度输出,输出结果叫哈希值/摘要单向不可逆,主打完整性校验、防篡改,不做数据加密。

一、核心特性

  1. 定长输出
    无论原文几字节、几GB,最终哈希串长度固定。
  2. 雪崩效应
    原文哪怕改1个比特,哈希值会彻底变化,肉眼看不出关联。
  3. 单向性
    无法从哈希值还原出原始数据。
  4. 抗碰撞
    理想状态下,很难找到两段不同原文,算出同一个哈希值(碰撞)。

二、主流算法分类&参数

1. 不安全(已淘汰,仅普通校验用)

  • MD5
    输出:128位(32位十六进制字符)
    问题:已被攻破,可人为构造碰撞,严禁用于安全验签、密码存储
  • SHA-1
    输出:160位(40位十六进制字符)
    同样出现碰撞漏洞,主流场景逐步下线。

2. 目前安全主流(工业标准)

属于 SHA-2 家族

  • SHA-256
    输出:256位(64位十六进制),互联网、接口、文件校验、HTTPS、签名最常用。
  • SHA-512
    输出:512位,安全性更高,计算开销略大,多用于高安全场景。

3. 新一代标准

SHA-3:全新哈希架构,安全性更强,逐步推广中。

三、典型应用场景(对应你之前说的「传输校验」)

  1. 数据传输/文件校验
    发送方算出文件/报文哈希值一并发送;接收方重新计算,比对一致=数据未篡改、未丢包。
  2. 密码存储
    网站不存明文密码,只存密码哈希。登录时比对哈希,保护隐私。
  3. 数字签名(搭配RSA)
    先对原文做哈希得到摘要,再用RSA私钥对摘要加密(签名),兼顾效率+防篡改+验身份。
  4. 哈希表(编程)
    数据结构里做快速查找,和安全无关。

四、和加密、CRC的区别

  1. vs 加密(如RSA)
    加密可逆,目的是保密;哈希不可逆,目的是校验完整性
  2. vs CRC
    CRC 是普通通信检错算法,无密码学安全性,易被人为篡改后伪造校验值;
    密码学哈希(SHA256)抗伪造,适合网络安全、业务数据验签。

五、简单示例

原文:hello

  • MD5:5d41402abc4b2a76b9719d911017c592
  • SHA256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

修改为 Hello(仅首字母大写),哈希值会完全改变。


结合技术场景,分安全领域、网络传输、编程开发、日常业务四大类,梳理哈希算法核心应用,附场景说明与常用算法:

一、数据完整性校验(最核心用途)

  1. 文件/软件校验
    官网提供安装包+哈希值,用户下载后本地重算哈希,比对一致说明文件未被篡改、下载无损坏。常用:SHA-256
  2. 网络报文传输校验
    接口、通信协议中,对请求/响应内容生成哈希,防止传输中数据被劫持篡改。

二、密码存储(互联网主流)

网站、APP绝不存储明文密码,只保存密码的哈希值。

  • 流程:用户注册 → 计算密码哈希入库;登录 → 比对输入密码的哈希与库中值。
  • 进阶:搭配盐值(salt) 对抗彩虹表破解,常用:SHA-256、SHA-512。
  • 淘汰:MD5、SHA-1 因安全性问题基本不再用于密码存储。

三、数字签名 & 身份认证(搭配RSA等非对称加密)

大文件/长文本直接RSA加密效率极低,行业通用方案:

  1. 先对原文做哈希,生成简短摘要;
  2. 用私钥加密摘要(生成签名);
  3. 接收方:原文算哈希 + 公钥解密签名,两者比对完成验签。
    应用:HTTPS、电子合同、软件签名、区块链交易签名。

四、区块链与分布式系统

  1. 区块通过哈希串联,修改任意区块内容,整条链哈希都会失效,保证账本不可篡改;
  2. 钱包地址、交易信息也基于哈希生成,主流使用 SHA-256

五、编程与数据结构(非安全用途)

  1. 哈希表/哈希集合
    编程语言(Java、Python、C++)中,用哈希将键值映射到数组下标,实现O(1) 级快速查找,是字典、缓存的底层核心。
  2. 去重处理
    对文本、图片、文件生成哈希,相同内容哈希一致,快速识别重复数据,用于网盘、数据库、日志去重。

六、其他拓展场景

  1. 随机数/令牌生成
    结合时间戳、随机串做哈希,生成一次性验证码、会话Token、临时链接。
  2. 隐私脱敏
    对手机号、身份证等敏感信息做哈希处理,在不泄露明文的前提下完成数据比对。

补充区分

  • 侧重防篡改、安全校验:优先 SHA-256/SHA-512/SHA-3;
  • 老旧系统简单校验:遗留 MD5/SHA-1(不建议新业务使用);
  • 纯数据查找、去重:仅利用哈希映射特性,无安全要求。


用通俗逻辑 + 分步流程 + 简易模拟算法讲清,再区分通用流程主流 SHA-256 核心步骤,附极简手工示例。

一、哈希通用计算逻辑(所有哈希算法共通流程)

整体分为 4 步:补位填充 → 分块 → 迭代压缩 → 拼接输出
核心思想:把任意长度数据,切分成固定大小块,反复用压缩函数混算,最终输出定长摘要。


1. 第一步:数据补位(Padding)

原始数据长度不一定刚好是算法规定块大小的整数倍,必须补齐。
通用规则(以绝大多数哈希为例):

  1. 数据末尾先补一个二进制 1
  2. 再补若干个二进制 0,直到整体长度 = 「块长 – 64bit」;
  3. 最后 64bit 存入原始数据的二进制总长度(大端序)。

目的:统一分块格式,保证不同长度输入能按相同规则处理。

2. 第二步:分块(Split)

把补位完成的完整数据,切分成等大的数据块

  • MD5 / SHA-1:块大小 512 bit
  • SHA-256:块大小 512 bit
  • SHA-512:块大小 1024 bit

3. 第三步:初始化哈希初始值(初始向量 IV)

算法内置一组固定常数(初始哈希值),作为迭代计算的起点。
例:SHA-256 预设 8 个 32 位初始哈希值 $h_0 \sim h_7$。

4. 第四步:逐块迭代压缩(核心运算)

对每一个 512bit 数据块依次处理:

  1. 将 512bit 块拆成 16 个 32bit 子分组;
  2. 通过扩展函数,把 16 组扩展成 64 组临时数据;
  3. 执行多轮非线性混合运算(位运算:与、或、异或、移位、循环移位、加法),搭配算法内置常数;
  4. 运算结果和上一轮哈希值叠加,得到新的哈希值;
  5. 用新哈希值作为下一个数据块的输入。

5. 第五步:拼接结果

所有数据块处理完毕后,把最终的一组哈希值按顺序拼接,得到最终哈希摘要


二、极简模拟:自己写一个“玩具哈希”(看懂运算本质)

不用复杂标准算法,造一个简易哈希,直观理解计算过程。

设定规则

  1. 输入:英文字符串,先转 ASCII 十进制数
  2. 块大小:每 2 个字符为 1 块
  3. 初始值:sum = 100
  4. 压缩规则:
    每块两个数 $a,b$,执行:$\boldsymbol{sum = (sum + a \times b) \bmod 256}$
  5. 最终输出 sum(8位结果)

演算示例

输入字符串:ab

  1. 转 ASCII:a=97,b=98
  2. 初始 sum = 100
  3. 计算:
    $$sum = (100 + 97 \times 98) \bmod 256 = 9606 \bmod 256 = 134$$
    最终哈希结果:134

再改输入为 ac(仅第二个字符变化):
a=97,c=99

$$sum = (100 + 97 \times 99) \bmod 256 = 9703 \bmod 256 = 231$$
结果完全不同,体现雪崩效应

标准哈希(MD5/SHA)只是把「简单加减取模」换成了大量位运算、多轮迭代、复杂扩展函数,整体框架和这个玩具哈希完全一致。


三、主流算法:SHA-256 标准计算简要拆解(工业级)

1. 基础参数

  • 块大小:512 bit
  • 输出:256 bit(8个32位整数)
  • 迭代轮数:每块执行 64 轮运算

2. 完整步骤

  1. 原始数据 → 二进制
    把文本/文件逐字节转为 8 位二进制串。
  2. 补位填充
    末尾补 1 + 若干 0,最后 64 位记录原数据长度,使总长度为 512 的整数倍。
  3. 分块
    切成若干个 512 bit 数据块。
  4. 初始化 8 个 32 位初始哈希值(算法固定常量)
  5. 单块内部运算
    ① 512bit 拆为 16 个 32bit 字;
    ② 扩展为 64 个 32bit 字;
    ③ 64 轮循环:使用逻辑函数、循环移位、预定义常数做混合计算;
    ④ 本轮结果与上一轮哈希值累加更新。
  6. 遍历所有块
    逐个块重复上面运算,持续更新哈希值。
  7. 拼接输出
    8 个最终 32 位数值按顺序拼接,得到 256 位 SHA-256 摘要。

四、关键补充

  1. 为什么不可逆?
    计算全程大量使用取模、截断、多对一映射,多个原始数据会映射到同一个中间值,丢失原始信息,无法逆向还原。
  2. 为什么改1字符结果大变?
    每一轮运算都会放大微小差异,经过几十轮迭代后,输出完全改变(雪崩效应)。
  3. 手工算标准哈希?
    不现实:SHA-256 单块就要 64 轮复杂位运算,日常都是代码/工具调用库函数计算。

Leave a Reply