
PRF、MAC、KDF、XOFモードを備えた高速暗号学的ハッシュ関数。検証済みストリーミング、インクリメンタル更新、およびマークル木構造による並列ハッシュをサポート。
BLAKE3 は、以下の特徴を持つ暗号学的ハッシュ関数です:
以下のグラフは、2019 年の Cascade Lake-SP 8275CL サーバー CPU における 16 KiB 入力のベンチマーク例です。より詳細なベンチマークについては、BLAKE3 論文を参照してください。
BLAKE3 は、確立されたハッシュ関数 BLAKE2 の最適化されたインスタンスと、オリジナルの Bao ツリーモード に基づいています。仕様と設計の根拠は BLAKE3 論文 で入手できます。デフォルトの出力サイズは 256 ビットです。現在のバージョンの Bao は、BLAKE3 を使用した検証付きストリーミングを実装しています。
このリポジトリは BLAKE3 の公式実装です。以下が含まれます:
Rust クレート blake3。SSE2、SSE4.1、AVX2、AVX-512、NEON、WASM 向けの最適化実装を含み、x86 では自動ランタイム CPU 機能検出を行います。rayon 機能によりマルチスレッドが利用可能。
Rust クレート b3sum。コマンドラインインターフェースを提供します。デフォルトでマルチスレッドを使用し、一般的なデスクトップハードウェア上で sha256sum よりも一桁高速です。
C 実装は、Rust 実装と同様に SIMD 最適化(WASM を除くすべて)、x86 での CPU 機能検出、およびオプションのマルチスレッドを含みます。c/README.md を参照してください。
Rust リファレンス実装は、BLAKE3 論文のセクション 5.1 で説明されています。この実装は上記の最適化されたものよりもはるかに小さく単純です。BLAKE3 の動作を理解したい場合、またはマルチスレッドや SIMD 最適化を必要としない移植を作成している場合は、こちらから始めてください。リファレンス実装の他の言語への移植は別のリポジトリでホストされています(C、Python)。
拡張出力、3 つのモードすべて、およびさまざまな入力長をカバーするテストベクターのセット。
BLAKE3 は以下によって設計されました:
BLAKE3 の開発は Electric Coin Company によってスポンサーされました。
BLAKE3 は Community Cryptography Specification Project (C2SP) でも仕様化されています。
注: BLAKE3 はパスワードハッシュアルゴリズムではありません。高速になるよう設計されているためです。パスワードハッシュは高速であってはなりません。ハッシュを保存するためにパスワードをハッシュ化する場合や、パスワードからキーを導出する場合は、Argon2 を推奨します。
b3sum utilityb3sum コマンドラインユーティリティは、ファイルまたは標準入力の 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 クレートへの依存関係を追加します。以下は入力バイトのハッシュ化の例です:
// 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 の 2 つのモードを提供します。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/README.md を参照してください。
追跡しきれないほど多くの実装がありますが、いくつかの注目すべきものとしては、最適化された Go 実装、Node.js とブラウザ向けの Wasm バインディング、Python 用バイナリホイール、.NET バインディング、純粋な Java 実装 などがあります。
詳細は CONTRIBUTING.md を参照してください。
この作品は CC0 1.0 のもとでパブリックドメインに提供されています。あるいは、以下のいずれかのライセンスで提供されています: