很多人在做接口加密、文件校验、数据脱敏的时候,经常把 SHA256 和 AES 搞混,甚至误以为它们是同类东西。一句话先总结:SHA256 是单向哈希,用来做指纹、完整性校验;AES 是对称加密,用来可逆地保护数据机密性。二者定位完全不同,经常搭配使用,但不能互相替代。
SHA‑256(SHA2 家族,FIPS 180-4)
SHA256 属于密码哈希函数,是单向算法。
- 输出:固定 256 bit,也就是 32 字节,日常一般展示为 64 位十六进制字符串
- 核心特性:
- 不管输入多长,输出长度永远固定;
- 雪崩效应:原文哪怕改动一个比特,最终哈希值会发生巨大变化;
- 无法逆向还原原始内容,只能做比对校验。
- 典型场景:文件完整性校验、HMAC 签名摘要、Git 版本标识、区块链指纹。
⚠️ 重要避坑:不要直接用 SHA256 存储用户密码。SHA256 运算速度很快,极易被彩虹表、暴力破解。密码存储优先使用 Argon2、bcrypt、PBKDF2 这类慢哈希算法。
示例: sha256("hello") → 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
AES(Advanced Encryption Standard,FIPS 197)
AES 是高级加密标准,属于对称分组加密算法,是可逆加密。
- 分组大小固定 128 bit;密钥可选三种规格:AES‑128 / AES‑192 / AES‑256
- 核心特性:加密和解密使用同一个密钥;现代 CPU 大多支持 AES-NI 硬件指令,加密解密性能很高。
- 加密模式是重中之重:
- ECB:不推荐,安全性差,禁止业务使用;
- CBC:需要 IV,只提供加密,没有自带防篡改校验;
- GCM(首选推荐):认证加密模式,同时完成加密 + 完整性校验,输出密文和校验 tag。
⚠️ GCM 模式红线:绝对不能重复使用同一个 nonce + 密钥组合,会直接破坏加密安全。
典型场景:磁盘加密、接口 Payload 加密、敏感文件加密、TLS 底层数据流加密。
SHA256 和 AES 简明对比
表格
| 对比项 | SHA‑256 | AES |
|---|---|---|
| 算法方向 | 单向,不可解密 | 双向,持有密钥即可解密 |
| 是否需要密钥 | 原生不需要;HMAC-SHA256 才需要密钥 | 必须密钥,GCM/CBC 还需要 IV/nonce |
| 核心目标 | 完整性校验、消息指纹 | 数据保密性(GCM 附带完整性校验) |
| 输出长度 | 固定 256bit | 密文长度接近明文,额外附带 IV、tag |
工程里常见的组合方案
- AES-GCM 加密业务敏感数据,SHA256 额外计算摘要,用于二次文件 / 消息完整性复核;
- HMAC‑SHA256:带密钥的哈希签名,用于接口验签,防止参数被篡改;
- HKDF / PBKDF2:以 SHA256 为底层哈希,从用户密码派生安全的 AES 加密密钥。
写在最后
简单记一个判断逻辑:
- 如果你只是想校验有没有被改动、生成唯一指纹,不需要还原原文 → 选 SHA256(HMAC 加密钥防篡改);
- 如果你之后还要把密文还原回原始明文,保护内容不被别人偷看 → 选 AES,优先 GCM 模式。
加密方案没有万能公式,理解二者定位,才不会写出有安全漏洞的代码。
正文完
可以使用微信扫码关注公众号(ID:xzluomor)