首页/安全/加密与证书速查/Blowfish 与其衍生用法
加密算法基础95 条

Blowfish 与其衍生用法

1993 年发布的 64 位分组密码:密钥 32-448 位、16 轮 Feistel;因分组偏小不再用于新协议,但其密钥编排被 bcrypt 口令散列沿用。

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

Blowfish 的现状

Blowfish 是 1993 年公开设计的 64 位分组密码,密钥长度 32 到 448 位,16 轮 Feistel 结构。由于分组偏小,它在长连接与大数据量场景存在碰撞类风险,已不再用于新协议;不过它的密钥编排被 bcrypt 口令散列沿用,因此在口令存储领域仍以另一种形式存在。读取旧数据时要注意新版库默认不再加载该算法。

基本信息

分组与密钥64 位分组,32 到 448 位密钥
轮数16 轮 Feistel 结构
来源公开设计,算法细节完全公开
衍生用法口令散列方案沿用其密钥编排

典型使用场景

  • 迁移评估:识别系统中仍在使用的旧算法
  • 读取历史数据:确认库是否需要显式启用旧算法
  • 口令存储:区分该算法与基于它的散列方案
  • 合规检查:核对算法清单是否符合要求
  • 排错:新版库读取旧数据时报算法不可用

识别遗留加密

识别遗留加密
openssl list -cipher-algorithms | grep -i bf   # 查看库中是否仍有该算法
openssl enc -bf-cbc -provider legacy -provider default -pbkdf2 -in old.dat -out old.enc
openssl version -a                              # 确认当前库版本与 provider 配置

现状判断

用途是否建议原因
新协议加密不建议分组仅 64 位,存在碰撞类风险
历史数据解密仅按需需显式启用旧算法
口令散列使用现代方案应选专用口令算法
合规场景按清单评估需确认算法是否在允许列表
64 位分组在长连接与大数据量场景存在碰撞风险;新系统应使用现代分组算法,该算法只保留在特定的口令散列用途中。

落地建议

  • 先盘点存量系统是否仍在使用该算法
  • 为历史数据制定迁移与重加密计划
  • 新开发一律使用现代算法
  • 把算法清单纳入合规检查项
基于该算法密钥编排的口令散列方案与算法本身不是一回事,两者不能互相替代:一个用于加密数据,另一个用于抵抗口令猜测。

易错点

  • 把口令散列方案与该分组密码混为一谈,二者不能互相替代
  • 新版库读取旧数据时直接报错,未意识到需要启用旧算法
  • 在新系统中继续使用该算法加密数据,忽略了分组偏小的风险
  • 只关注算法是否可用,不关注密钥长度与工作模式是否合理
  • 迁移时只转换格式而不更换算法,风险仍然存在

数据来源与参考

  • NIST SP 800-131A Rev.2(算法停用清单)
  • Provos & Mazieres, A Future-Adaptable Password Scheme(USENIX 1999)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌