首页/安全/加密与证书速查/哈希截断与指纹长度
加密算法基础95 条

哈希截断与指纹长度

把摘要截断使用会按位削弱强度:截断到 n 位后抗碰撞约 n/2、抗前像约 n 位;证书指纹、消息 ID 等场景需要明确长度约定。

加密与证书速查安全更新于 2026-10-13

哈希截断与指纹长度

把摘要截断使用会按位削弱强度:截断到 n 位后,抗碰撞强度约为 n/2 位,抗前像强度约为 n 位。证书指纹展示、消息去重 ID、文件校验等领域都存在长度约定问题,一旦两端约定不一致,就会出现「同一个数据却对不上」的情况,排查时又很难想到是长度而非内容出了问题。

基本信息

基本规律截断到 n 位后抗碰撞约 n/2 位
典型例子SHA-256 截断到 128 位后抗碰撞约 64 位
常见用法证书指纹展示(SHA-256 全长 32 字节)
展示差异不同系统的大小写与分隔符格式不同,比对前需规范化
截断策略需要截断时应在协议里明确算法与长度

典型使用场景

  • 核对证书指纹时区分「展示用」与「校验用」
  • 排查文件校验失败:两侧截断长度不一致
  • 评估短标识的碰撞风险(日志关联键、幂等键)
  • 清点存量系统中 SHA-1 与 SHA-256 指纹的使用位置
  • 设计协议时同时确定指纹长度与显示格式

计算与截断

计算与截断
# 证书指纹:SHA-256 全长 32 字节
openssl x509 -in cert.pem -noout -fingerprint -sha256
openssl x509 -in cert.pem -noout -fingerprint -sha1   # 仅兼容查看,不建议用于校验
# 自行计算摘要并按需截断(此处取前 16 字节)
openssl dgst -sha256 -binary file.bin | head -c 16 | xxd
sha256sum file.bin                                   # 完整摘要,适合校验场景

截断长度与强度

截断长度抗碰撞强度适用建议
256 位约 128 位签名与证书校验
160 位约 80 位SHA-1,已不可用于对抗场景
128 位约 64 位短标识与去重键,需评估数据规模
64 位约 32 位仅非对抗场景,谨慎使用
人工核对指纹很容易出错,长串字符少看一位就前功尽弃。建议用脚本比对并输出逐字节差异;不同系统的展示格式不同(大写、冒号分隔),脚本比对前先做规范化处理,避免把格式差异误判成内容不一致。
实践建议:系统内部统一约定「指纹一律使用 SHA-256 全长,展示时才做分组与大小写格式化」,可以把大部分比对问题挡在入口之外;确需短标识时,在其中显式带上算法名前缀,避免不同来源的摘要混用。

易错点

  • 把 SHA-256 截断到 128 位后当作「128 位安全」使用 → 抗碰撞只剩约 64 位,属于明显高估
  • 两侧截断长度或所用算法不一致 → 校验长期失败,而日志里看不出问题出在长度上
  • 展示格式差异被当成内容不一致 → 大小写与分隔符未规范化,误判为证书被替换
  • 在对抗场景用短摘要做标识 → 碰撞可被构造,涉及审批或去重逻辑时风险更高

数据来源与参考

  • NIST SP 800-107 Rev.1(哈希的截断使用)
  • FIPS 180-4
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌