3 个稳定版本

1.4.5 2024年4月24日
1.4.4 2023年12月5日
1.4.3 2023年8月2日
1.4.2 2023年8月1日

#70加密学

Download history 1260/week @ 2024-05-01 1227/week @ 2024-05-08 2170/week @ 2024-05-15 1476/week @ 2024-05-22 1629/week @ 2024-05-29 1853/week @ 2024-06-05 1474/week @ 2024-06-12 1569/week @ 2024-06-19 2099/week @ 2024-06-26 2435/week @ 2024-07-03 1773/week @ 2024-07-10 2229/week @ 2024-07-17 2157/week @ 2024-07-24 2958/week @ 2024-07-31 3356/week @ 2024-08-07 3134/week @ 2024-08-14

11,907 每月下载量
用于 13 个 crate (6 直接)

CC0-1.0 OR Apache-2.0

1.5MB
35K SLoC

GNU Style Assembly 18K SLoC Assembly 9K SLoC // 0.0% comments Rust 5K SLoC // 0.1% comments C 3.5K SLoC // 0.1% comments Python 151 SLoC // 0.1% comments

BLAKE3

BLAKE3 是一种加密哈希函数,比 MD5、SHA-1、SHA-2、SHA-3 和 BLAKE2

  • 快得多
  • 安全,与 MD5 和 SHA-1 不同。并且对长度扩展攻击有抵抗力,与 SHA-2 不同。
  • 高度并行化,适用于任何数量的线程和 SIMD 通道,因为它内部是一个默克尔树。
  • 能够进行 验证流式传输增量更新,同样因为它是默克尔树。
  • 是一个 PRFMACKDFXOF,以及一个常规哈希。
  • 无变体的单一算法,在 x86-64 和较小的架构上都很快速。

下方的 图表 是 2019 年 Cascade Lake-SP 8275CL 服务器 CPU 上 16 KiB 输入的示例基准。有关更详细的基准测试,请参阅 BLAKE3 论文

performance graph

BLAKE3 基于经过优化的已知哈希函数 BLAKE2 和原始的 Bao 树模式。规范和设计理念可在 BLAKE3 论文 中找到。默认输出大小为 256 位。当前版本的 Bao 实现了使用 BLAKE3 的验证流式传输。

此仓库是 BLAKE3 的官方实现。它包括

  • 包含针对 SSE2、SSE4.1、AVX2、AVX-512 和 NEON 优化的实现的 blake3 Rust crate,在 x86 上自动检测 CPU 功能。提供多线程功能的 rayon 功能。

  • 提供命令行界面的 b3sum Rust crate。默认使用多线程,在典型桌面硬件上比例如 sha256sum 快一个数量级。

  • C实现版本,与Rust实现一样,包含了SIMD代码和x86的运行时CPU功能检测。与Rust实现不同,它目前还没有多线程功能。请参阅c/README.md

  • Rust参考实现版本,在BLAKE3论文的第5.1节中进行了讨论。这个实现比上面提到的优化版本要小得多,简单得多。如果你想了解BLAKE3的工作原理,或者你正在编写一个不需要多线程或SIMD优化的端口,从这里开始。参考实现的其他语言版本托管在单独的仓库中(CPython)。

  • 一组测试向量,涵盖了扩展输出、所有三种模式和各种输入长度。

  • Actions Status

BLAKE3由以下人员设计:

BLAKE3的开发得到了Electric Coin Company的赞助。

注意:BLAKE3不是一个密码散列算法,因为它被设计成快速,而密码散列不应该快。如果你散列密码以存储散列值或从密码派生密钥,我们建议使用Argon2

用法

b3sum实用工具

b3sum命令行实用工具打印文件或标准输入的BLAKE3散列。预构建的二进制文件可在Linux、Windows和macOS(需要未知的开发者解决方案)的发布页面上找到。如果你已经安装了Rust和Cargo,你也可以使用以下命令自己构建b3sum

cargo install b3sum

如果rustup没有为你配置PATH,你可能需要到例如~/.cargo/bin中查找已安装的二进制文件。你可以通过创建大文件并对其进行散列来测试你的机器上BLAKE3的速度,例如

# Create a 1 GB file.
head -c 1000000000 /dev/zero > /tmp/bigfile
# Hash it with SHA-256.
time openssl sha256 /tmp/bigfile
# Hash it with BLAKE3.
time b3sum /tmp/bigfile

blake3 crate docs.rs

要从Rust代码中使用BLAKE3,将blake3crate添加到你的Cargo.toml中的依赖项。以下是一些散列输入字节的示例

// Hash an input all at once.
let hash1 = iroh_blake3::hash(b"foobarbaz");

// Hash an input incrementally.
let mut hasher = blake3::Hasher::new();
hasher.update(b"foo");
hasher.update(b"bar");
hasher.update(b"baz");
let hash2 = hasher.finalize();
assert_eq!(hash1, hash2);

// Extended output. OutputReader also implements Read and Seek.
let mut output = [0; 1000];
let mut output_reader = hasher.finalize_xof();
output_reader.fill(&mut output);
assert_eq!(hash1, output[..32]);

// Print a hash as hex.
println!("{}", hash1);

除了hash外,BLAKE3还提供了两种其他模式,keyed_hashderive_key。在keyed_hash模式下,需要256位密钥

// MAC an input all at once.
let example_key = [42u8; 32];
let mac1 = blake3::keyed_hash(&example_key, b"example input");

// MAC incrementally.
let mut hasher = blake3::Hasher::new_keyed(&example_key);
hasher.update(b"example input");
let mac2 = hasher.finalize();
assert_eq!(mac1, mac2);

derive_key模式下,需要上下文字符串和一些密钥材料(不是密码)。上下文字符串应该是硬编码的、全局唯一的、与应用程序相关的。上下文字符串的好格式是"[application] [commit timestamp] [purpose]"

// Derive a couple of subkeys for different purposes.
const EMAIL_CONTEXT: &str = "BLAKE3 example 2020-01-07 17:10:44 email key";
const API_CONTEXT: &str = "BLAKE3 example 2020-01-07 17:11:21 API key";
let input_key_material = b"usually at least 32 random bytes, not a password";
let email_key = blake3::derive_key(EMAIL_CONTEXT, input_key_material);
let api_key = blake3::derive_key(API_CONTEXT, input_key_material);
assert_ne!(email_key, api_key);

C实现

请参阅c/README.md

其他实现

我们会在得知相关消息时,在@BLAKE3team Twitter 账号上发布第三方绑定和实现的链接。一些亮点包括优化的 Go 实现Node.js 和浏览器的 Wasm 绑定Python 的二进制轮子.NET 绑定以及JNI 绑定

贡献

请参阅CONTRIBUTING.md

知识产权

Rust 代码版权属于 Jack O'Connor,2019-2020。C 代码版权属于 Samuel Neves 和 Jack O'Connor,2019-2020。汇编代码版权属于 Samuel Neves,2019-2020。

本作品以 CC0 1.0 公共领域发布。或者,它可以在 Apache License 2.0 许可下使用。

采用与部署

以下是使用 BLAKE3 的协议和软件列表(非详尽)

杂项

依赖项

~96–730KB
~15K SLoC