3 个稳定版本
1.5.0 | 2023 年 10 月 9 日 |
---|---|
1.4.1 | 2023 年 9 月 3 日 |
1.3.5 | 2023 年 9 月 3 日 |
1.3.4 |
|
1.3.3 |
|
#169 in 加密学
用于 2 crates
2.5MB
67K SLoC
免责声明:这是一个为 Fleek 网络(一个去中心化边缘网络)修改和优化的官方 Rust 实现的 Blake3 哈希函数的 fork。
BLAKE3 是一种加密哈希函数,
- 比 MD5、SHA-1、SHA-2、SHA-3 和 BLAKE2 要快得多。
- 更安全,与 MD5 和 SHA-1 不同。并且对长度扩展攻击具有抵抗力,与 SHA-2 不同。
- 高度并行化,可跨任意数量的线程和 SIMD 通道进行,因为它是一个 Merkle 树。
- 能够进行 验证流 和 增量更新,同样因为它是 Merkle 树。
- 是一个 伪随机函数、消息认证码、密钥导出函数、扩展函数以及一个常规哈希。
- 一个没有变种的算法,它在 x86-64 和较小的架构上都很快。
下方的 图表 是 2019 年 Cascade Lake-SP 8275CL 服务器 CPU 上 16 KiB 输入的示例基准测试。有关更详细的基准测试,请参阅 BLAKE3 论文。
BLAKE3 基于优化的成熟哈希函数 BLAKE2 和原始的 Bao 树模式。规格和设计原理可在 BLAKE3 论文 中找到。默认输出大小为 256 位。当前版本的 Bao 实现了带有 BLAKE3 的验证流。
此存储库是 BLAKE3 的官方实现。它包括
-
blake3
Rust 包,它包括针对 SSE2、SSE4.1、AVX2、AVX-512 和 NEON 的优化实现,并在 x86 上自动检测 CPU 功能。`rayon` 功能提供了多线程支持。 -
b3sum
Rust 库,它提供了一个命令行接口。它默认使用多线程,这使得它在典型桌面硬件上比例如sha256sum
快一个数量级。 -
C 实现版本,与 Rust 实现一样,包括 SIMD 代码和在 x86 上的运行时 CPU 功能检测。与 Rust 实现不同的是,它目前没有多线程功能。请参阅
c/README.md
。 -
Rust 参考实现版本,在 BLAKE3 论文的 5.1 节中进行了讨论。这个实现比上面的优化版本小得多,简单得多。如果您想了解 BLAKE3 的工作原理,或者您正在编写不需要多线程或 SIMD 优化的端口,请从这里开始。参考实现的其他语言的端口托管在单独的存储库中(C,Python)。
-
一组测试向量,涵盖了扩展输出、所有三种模式和多种输入长度。
BLAKE3 由以下人员设计:
- @oconnor663 (Jack O'Connor)
- @sneves(Samuel Neves)
- @veorq(Jean-Philippe Aumasson)
- @zookozcash(Zooko)
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
要从 Rust 代码中使用 BLAKE3,请在您的 Cargo.toml
中添加对 blake3
crate 的依赖项。以下是一些对输入字节进行散列的示例
// Hash an input all at once.
let hash1 = 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_hash
和 derive_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的协议和软件列表
杂项
- @veorq和@oconnor663就设计BLAKE3进行了播客采访。
依赖项
~0.1–0.8MB
~17K SLoC