1 个稳定版本

1.5.0 2024年1月23日

#1936 in 魔法豆

Download history • Rust 包仓库 102/week @ 2024-04-14 • Rust 包仓库 1/week @ 2024-05-05 • Rust 包仓库 49/week @ 2024-05-12 • Rust 包仓库 92/week @ 2024-05-19 • Rust 包仓库 1/week @ 2024-06-02 • Rust 包仓库 98/week @ 2024-06-23 • Rust 包仓库 179/week @ 2024-07-21 • Rust 包仓库

180 每月下载次数

CC0-1.0 OR Apache-2.0

1.5MB
36K SLoC

GNU Style Assembly 18K SLoC • Rust 包仓库 Assembly 9K SLoC // 0.0% comments • Rust 包仓库 Rust 5.5K SLoC // 0.1% comments • Rust 包仓库 C 3.5K SLoC // 0.1% comments • Rust 包仓库 Python 151 SLoC // 0.1% comments • Rust 包仓库

BLAKE3

这是Fluence对BLAKE3项目的分支。它通过BLAKE3的wasm32-SIMD Rust实现与上游不同。

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

  • 快得多
  • 安全,与MD5和SHA-1不同。并且比SHA-2更安全,不会受到长度扩展攻击。
  • 高度并行化,可以跨任何数量的线程和SIMD通道,因为它内部是一个Merkle树。
  • 能够进行 验证流式传输增量更新,再次因为它是Merkle树。
  • 作为 PRFMACKDFXOF,以及普通哈希。
  • 一个没有变种的算法,在x86-64和较小的架构上都非常快。

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

performance graph

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

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

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

  • b3sum Rust 包,它提供了一个命令行界面。默认情况下,它使用多线程,因此在典型台式机上比例如 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,请将 blake3 crate 添加到您的 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_hashderive_keykeyed_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的协议和软件的(非详尽)列表

杂项

依赖项

~0.1–0.8MB
~16K SLoC