SHA-256 解释:哈希、完整性检查、盐值与误用
SHA-256 解释:哈希、完整性检查、盐值与误用
介绍 SHA-256 哈希、文件完整性检查、密码存储注意事项、碰撞抗性,以及为什么哈希不是加密。
原创流程图
SHA-256 解释:哈希、完整性检查、盐值与误用
理解原理
检查后再进入下一步
检查边界
检查后再进入下一步
使用工具
检查后再进入下一步
密码学哈希函数把任意大小的数据映射成固定长度输出。SHA-256 输出 256 位,通常显示为 64 个十六进制字符。它设计上难以从摘要还原原文,也难以找到两个不同输入拥有相同摘要。
软件下载常发布 SHA-256 校验和。下载后对本地文件求哈希并比较,匹配说明文件大概率与发布者计算摘要时相同。这证明一致性,不证明发布者可信;如果文件和校验和来自同一被篡改页面,仍可能被误导。
相同输入总是产生相同 SHA-256 摘要。这有利于查重和校验,也意味着低熵输入可能被猜出。常见词、短码或可预测 ID 的哈希可以通过枚举猜测匹配。哈希让内容不直观,但不会让弱输入变强。
SHA-256 很快,这对完整性检查有利,对密码存储不利。攻击者可以高速尝试猜测。密码系统需要盐值和专门的密码哈希算法,如 bcrypt、scrypt 或 Argon2,并根据平台建议设置成本。
加密可以用密钥还原,哈希不是为了还原。如果需要取回原数据,哈希就是错误工具;如果要证明数据未变,哈希可能合适;如果要证明来源,还需要签名或消息认证码。
看似相同的输入可能因为空格、换行、Unicode 规范化、JSON key 顺序、文件元数据和编码不同而哈希不同。文本框可能规范化换行,文件哈希则按原始字节计算。结构化数据要跨系统一致,必须定义规范表示。
文件校验时直接对文件字节求哈希,并从可信渠道比较校验和。文本比较要先决定编码和换行。API 签名必须严格遵守服务方规范化规则。密码不要使用裸 SHA-256。可预测敏感值的哈希也要谨慎对待。
常见问题
不能。SHA-256 是单向哈希,不是加密;只能比较猜测或已知输入。
可能空格、换行、Unicode 规范化或编码不同。哈希处理的是字节。
不适合单独使用。应使用带盐和值得配置成本的密码哈希算法。
对下载文件的精确字节求哈希,并与可信来源的摘要比较。
JSON 可用不同空白、key 顺序和转义表示相似数据;哈希看字节,不看意图。
可以识别精确字节序列,但如果输入可预测,别人仍可猜测或查表。