34个版本 (14个稳定版)
新版本 1.5.4 | 2024年8月19日 |
---|---|
1.5.3 | 2024年7月15日 |
1.5.1 | 2024年3月12日 |
1.5.0 | 2023年9月21日 |
0.0.0 | 2019年9月17日 |
#3 in 密码学
每月 1,712,071 次下载
用于3,060 个crate (487 个直接使用)
1.5MB
38K SLoC
BLAKE3是一种加密哈希函数,它比MD5、SHA-1、SHA-2、SHA-3和BLAKE2
- 快得多。
- 安全,与MD5和SHA-1不同。并且对长度扩展攻击具有抵抗力,与SHA-2不同。
- 高度并行化,可跨任意数量的线程和SIMD通道进行,因为它内部是Merkle树。
- 能够进行验证流式传输和增量更新,再次因为它是Merkle树。
- 是一个PRF、MAC、KDF和XOF,以及一个常规哈希函数。
- 一个没有变种的算法,在x86-64架构上运行速度快,在小架构上也同样快。
下方的图表是一个16 KiB输入的例子,展示了2019年Cascade Lake-SP 8275CL服务器CPU的基准测试。对于更详细的基准测试,请参阅BLAKE3论文。
BLAKE3基于优化版本的成熟哈希函数BLAKE2和原始的Bao树模式。规范和设计原理可在BLAKE3论文中找到。默认输出大小为256位。当前版本的Bao实现了BLAKE3的验证流式传输。
此仓库是BLAKE3的官方实现。它包括
-
blake3
Rust crate,它包括针对SSE2、SSE4.1、AVX2、AVX-512和NEON的优化实现,并在x86上自动检测CPU功能。rayon
特性提供了多线程支持。 -
b3sum
Rust crate,它提供了一个命令行界面。默认情况下使用多线程,使得它在典型台式机上比例如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
包
要从Rust代码中使用BLAKE3,请将blake3
包作为依赖项添加到你的Cargo.toml
中。以下是一些散列输入字节的示例
// 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。
许可
本作品以CC0 1.0发布到公有领域。或者,它受以下任何一种许可协议的约束
采用与部署
以下是一个(非详尽)列表,列出了使用BLAKE3的协议和软件
杂项
- @veorq和@oconnor663对设计BLAKE3进行了播客采访。
依赖关系
~96–670KB
~13K SLoC