BLAKE2

BLAKE2
设计者
Jean-Philippe Aumasson
Samuel Neves
Zooko Wilcox-O'Hearn
Christian Winnerlein
首次发布
2012
类别
密码学哈希函数
输出长度
1~512 bit(可调)
结构
HAIFA(简化)
基础
BLAKE + 工程优化
速度
~3.5 GB/s (BLAKE2b)
安全状态
安全

BLAKE2 是 BLAKE 的工程优化版本,于 2012 年发布。BLAKE2 的设计目标是在保持与 BLAKE 相当的安全性的同时,大幅提升性能。事实证明,BLAKE2 比 MD5 更快,同时提供了远超 MD5 的安全性,成为"又快又安全"的典范。

设计动机

BLAKE 在 SHA-3 竞赛中表现出色,但作为竞赛提交方案,它需要满足 NIST 的各种要求(如多输出长度、盐值支持等),这些要求增加了实现复杂度。BLAKE2 的设计者认为,可以通过简化这些可选特性来大幅提升性能,同时不牺牲核心安全性。

核心理念:BLAKE2 不是设计一个新的哈希函数,而是对 BLAKE 进行"瘦身"——去掉不必要的特性,优化关键路径,使其成为实用场景中的最佳选择。
关键优化
1. 减少轮数

BLAKE2 将轮数从 BLAKE 的 14/16 轮减少到 12/10 轮:

算法原始轮数BLAKE2 轮数减少
BLAKE-256 → BLAKE2s14 轮10 轮29%
BLAKE-512 → BLAKE2b16 轮12 轮25%

减少轮数的依据是安全余量分析:BLAKE 的最佳已知攻击仅能攻击到 2.5 轮,即使减少 4 轮,仍有足够的安全余量。

2. 简化填充方案

BLAKE 使用 HAIFA 结构,需要在消息末尾添加长度信息。BLAKE2 简化了这一过程:

BLAKE 填充(HAIFA): 消息 || 10...0 || 盐值 || 计数器 BLAKE2 填充(简化): 消息 || 10...0 (仅需简单的位填充)

BLAKE2 将盐值和计数器从压缩函数参数移到了初始化阶段,减少了每次压缩调用的开销。

3. 参数块(Parameter Block)

BLAKE2 引入了参数块,在初始化时一次性配置所有参数,避免了运行时的条件判断:

参数块结构(BLAKE2b,64 字节): Byte 0: 摘要长度(1-64) Byte 1: 密钥长度(0-64) Byte 2: 扇出(fanout,树模式) Byte 3: 最大深度(树模式) Byte 4-7: 叶子长度(树模式) Byte 8-31: 其他树参数 Byte 32-47: 盐值(可选) Byte 48-63: 个性化字符串(可选)
4. 树形哈希模式

BLAKE2 支持可选的树形哈希模式(BLAKE2bp/BLAKE2sp),可以充分利用多核处理器:

串行模式(BLAKE2b): 数据 → [块1] → [块2] → [块3] → ... → 哈希值 (顺序处理,无法并行) 树形模式(BLAKE2bp,4 路并行): 数据 → [块1] [块2] [块3] [块4] ... ↓ ↓ ↓ ↓ H1 H2 H3 H4 (并行计算) ↘ ↙ ↘ ↙ H12 H34 ↘ ↙ 哈希值
变体详解
变体字长轮数输出长度并行度适用场景
BLAKE2b64 bit121~512 bit串行64 位平台通用
BLAKE2s32 bit101~256 bit串行32 位/嵌入式
BLAKE2bp64 bit12512 bit4 路多核 64 位
BLAKE2sp32 bit10256 bit4 路多核 32 位
BLAKE2Xb64 bit12任意长度串行可扩展输出
BLAKE2Xs32 bit10任意长度串行可扩展输出
压缩函数

BLAKE2 的压缩函数与 BLAKE 基本相同,但有以下改进:

  • 轮常量:使用固定的轮常量,避免了 BLAKE 中的盐值参数
  • 消息调度:使用简化的消息置换表,减少了内存访问
  • 最终化:简化了最终输出的计算
BLAKE2b 压缩函数: compress(h, m, t, f): # h: 链接值(8 × 64 位) # m: 消息块(16 × 64 位) # t: 计数器(2 × 64 位) # f: 最终块标志 # 初始化工作变量 v[0..7] = h[0..7] v[8..11] = IV[0..3] v[12] = t[0] ^ IV[4] # 计数器低 64 位 v[13] = t[1] ^ IV[5] # 计数器高 64 位 v[14] = f ? ~IV[6] : IV[6] # 最终块标志 v[15] = IV[7] # 12 轮压缩 for round = 0 to 11: # 列混合 G(v, 0, 4, 8, 12, m[sigma[round][0]], m[sigma[round][1]]) G(v, 1, 5, 9, 13, m[sigma[round][2]], m[sigma[round][3]]) G(v, 2, 6, 10, 14, m[sigma[round][4]], m[sigma[round][5]]) G(v, 3, 7, 11, 15, m[sigma[round][6]], m[sigma[round][7]]) # 对角线混合 G(v, 0, 5, 10, 15, m[sigma[round][8]], m[sigma[round][9]]) G(v, 1, 6, 11, 12, m[sigma[round][10]], m[sigma[round][11]]) G(v, 2, 7, 8, 13, m[sigma[round][12]], m[sigma[round][13]]) G(v, 3, 4, 9, 14, m[sigma[round][14]], m[sigma[round][15]]) # 输出 return h ^ v[0..7] ^ v[8..15]
独特特性
密钥模式

BLAKE2 内置密钥支持,可直接作为 MAC(消息认证码)使用,无需 HMAC 封装:

BLAKE2-MAC(key, message): # 密钥填充到第一个块 第一个块 = key || 0...0 # 后续块正常处理 return BLAKE2(第一个块 || message)

这比 HMAC 更高效,因为 HMAC 需要两次哈希调用。

个性化(Personalization)

BLAKE2 支持个性化字符串,可以为不同应用创建域分离的哈希实例:

# 不同应用使用不同的个性化字符串 hash_app1 = BLAKE2(personalization="MyApp-v1.0") hash_app2 = BLAKE2(personalization="MyApp-v2.0") # 即使输入相同,输出也完全不同 hash_app1("hello") ≠ hash_app2("hello")
可调输出长度

BLAKE2 支持 1 到 512 位(BLAKE2b)或 1 到 256 位(BLAKE2s)的任意输出长度:

# 根据需要选择输出长度 BLAKE2b("hello", digest_size=1) # 8 位输出 BLAKE2b("hello", digest_size=32) # 256 位输出 BLAKE2b("hello", digest_size=64) # 512 位输出(默认)
性能对比
算法单线程速度安全性特点
BLAKE2b~3.5 GB/s安全64 位平台首选
BLAKE2s~3.0 GB/s安全嵌入式首选
MD5~3.5 GB/s已破解速度相当但不安全
SHA-256~1.8 GB/s安全BLAKE2b 快约 2 倍
SHA-3~1.5 GB/s安全BLAKE2b 快约 2.3 倍
关键成就:BLAKE2 是第一个在软件实现中比 MD5 更快的密码学哈希函数。这意味着开发者可以用 BLAKE2 替代 MD5,获得更好的安全性而不牺牲性能。
应用场景
  • Apple APFS:使用 BLAKE2b-256 进行文件系统校验
  • WireGuard VPN:使用 BLAKE2s 作为核心哈希
  • GNU Coreutils:b2sum 命令使用 BLAKE2b
  • IPFS:使用 BLAKE2b-256 作为内容寻址哈希
  • restic:备份工具使用 BLAKE2b 进行数据去重
  • Python 3.6+:hashlib.blake2b / hashlib.blake2s
  • Rust:blake2 crate
  • Go:golang.org/x/crypto/blake2
与 BLAKE 的关系

BLAKE2 与 BLAKE 的关系可以类比为:

  • BLAKE = 竞赛方案,功能全面,性能优秀
  • BLAKE2 = 生产版本,去掉可选特性,优化关键路径

BLAKE2 保持了 BLAKE 的核心安全性(相同的 G 函数、相同的扩散特性),但通过工程优化实现了更好的性能。这种"竞赛方案 → 生产优化"的路径在密码学中并不常见,BLAKE2 是一个成功的案例。

参考文献
  1. Aumasson, J.-P., Neves, S., Wilcox-O'Hearn, Z., Winnerlein, C. (2013). "BLAKE2: simpler, smaller, fast as MD5". SAC 2013.
  2. Aumasson, J.-P., Neves, S., Wilcox-O'Hearn, Z., Winnerlein, C. (2013). "BLAKE2: hashing faster than MD5". Cryptology ePrint Archive.
  3. BLAKE2 官方规范:https://www.blake2.net/blake2.pdf