
Быстрая криптографическая хеш-функция с режимами PRF, MAC, KDF и XOF. Поддерживает верифицированную потоковую передачу, инкрементальные обновления и параллелизованное хеширование с помощью структуры дерева Меркла.
# BLAKE3
BLAKE3 — это криптографическая хеш-функция, которая:
- **Значительно быстрее**, чем MD5, SHA-1, SHA-2, SHA-3 и BLAKE2.
- **Безопасна**, в отличие от MD5 и SHA-1. И защищена от атак увеличения длины, в отличие от SHA-2.
- **Высоко параллелизуема** на любом количестве потоков и SIMD-каналов, так как внутри представляет собой дерево Меркла.
- Поддерживает **верифицированную потоковую передачу** и **инкрементальные обновления**, также благодаря дереву Меркла.
- Является **PRF**, **MAC**, **KDF** и **XOF**, а также обычной хеш-функцией.
- **Единый алгоритм без вариантов**, быстрый как на x86-64, так и на менее мощных архитектурах.
Приведённый ниже [график](https://github.com/BLAKE3-team/BLAKE3-specs/blob/master/benchmarks/bar_chart.py) является примером теста производительности для входных данных размером 16 КиБ на серверном процессоре Cascade Lake-SP 8275CL 2019 года. Более подробные тесты производительности см. в [документе BLAKE3](https://github.com/BLAKE3-team/BLAKE3-specs/blob/master/blake3.pdf).
<p align="center">
<img src="https://raw.githubusercontent.com/blake3-team/blake3/HEAD/media/speed.svg" alt="график производительности">
</p>
BLAKE3 основана на оптимизированном экземпляре известной хеш-функции [BLAKE2](https://blake2.net) и на [оригинальном режиме дерева Bao](https://github.com/oconnor663/bao/blob/master/docs/spec_0.9.1.md). Спецификации и обоснование дизайна доступны в [документе BLAKE3](https://github.com/BLAKE3-team/BLAKE3-specs/blob/master/blake3.pdf). Размер вывода по умолчанию — 256 бит. Текущая версия [Bao](https://github.com/oconnor663/bao) реализует верифицированную потоковую передачу с BLAKE3.
Этот репозиторий является официальной реализацией BLAKE3. Он включает:
* Крейт [`blake3`](https://crates.io/crates/blake3) на Rust, который включает оптимизированные реализации для SSE2, SSE4.1, AVX2, AVX-512, NEON и WASM с автоматическим определением возможностей ЦП во время выполнения на x86. Функция `rayon` обеспечивает многопоточность.
* Крейт [`b3sum`](https://crates.io/crates/b3sum) на Rust, предоставляющий интерфейс командной строки. По умолчанию он использует многопоточность, что делает его на порядок быстрее, чем, например, `sha256sum`, на типичном настольном оборудовании.
* [Реализация на C](https://github.com/blake3-team/blake3/blob/master/c), которая, как и реализация на Rust, включает SIMD-оптимизации (все, кроме WASM), определение возможностей ЦП на x86 и опциональную многопоточность. См. [`c/README.md`](https://github.com/blake3-team/blake3/blob/master/c/README.md).
* [Эталонная реализация на Rust](https://github.com/blake3-team/blake3/blob/master/reference_impl/reference_impl.rs), которая обсуждается в разделе 5.1 [документа BLAKE3](https://github.com/BLAKE3-team/BLAKE3-specs/blob/master/blake3.pdf). Эта реализация значительно меньше и проще оптимизированных выше. Если вы хотите понять, как работает BLAKE3, или пишете порт, которому не нужны многопоточность или SIMD-оптимизации, начните отсюда. Порты эталонной реализации на другие языки размещены в отдельных репозиториях ([C](https://github.com/oconnor663/blake3_reference_impl_c), [Python](https://github.com/oconnor663/pure_python_blake3)).
* [Набор тестовых векторов](https://github.com/BLAKE3-team/BLAKE3/blob/master/test_vectors/test_vectors.json), охватывающий расширенные выходные данные, все три режима и различные длины входных данных.
* [](https://github.com/BLAKE3-team/BLAKE3/actions)
BLAKE3 была разработана:
* [@oconnor663] (Jack O'Connor)
* [@sneves] (Samuel Neves)
* [@veorq] (Jean-Philippe Aumasson)
* [@zookozcash] (Zooko)
Разработка BLAKE3 была спонсирована [Electric Coin Company](https://electriccoin.co).
BLAKE3 также [специфицирована](https://c2sp.org/BLAKE3) в [Проекте спецификаций криптографии сообщества (C2SP)](https://c2sp.org).
*ПРИМЕЧАНИЕ: BLAKE3 не является алгоритмом хеширования паролей, поскольку она разработана для высокой скорости, в то время как хеширование паролей не должно быть быстрым. Если вы хешируете пароли для хранения или получаете ключи из паролей, мы рекомендуем [Argon2](https://github.com/P-H-C/phc-winner-argon2).*
## Использование
### Утилита `b3sum`
Утилита командной строки `b3sum` выводит хеши BLAKE3 файлов или стандартного ввода. Предварительно собранные бинарные файлы доступны для Linux, Windows и macOS (требуется [обходной путь для неподтверждённых разработчиков](https://support.apple.com/guide/mac-help/open-a-mac-app-from-an-unidentified-developer-mh40616/mac)) на [странице релизов](https://github.com/BLAKE3-team/BLAKE3/releases). Если вы [установили Rust и Cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html), вы также можете собрать `b3sum` самостоятельно с помощью:
```bash
cargo install b3sum
```
Если `rustup` не настроил ваш `PATH`, возможно, вам придётся поискать установленный бинарный файл, например, в `~/.cargo/bin`. Вы можете проверить, насколько быстр BLAKE3 на вашей машине, создав большой файл и вычислив его хеш, например:
```bash
# 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` [](https://docs.rs/blake3)
Чтобы использовать BLAKE3 из кода на Rust, добавьте зависимость от крейта `blake3` в ваш `Cargo.toml`. Вот пример вычисления хеша некоторых входных байтов:
```rust
// 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-битный ключ:
```rust
// 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` принимает строку контекста и некоторый ключевой материал (не пароль). Строка контекста должна быть жёстко задана, глобально уникальна и зависеть от приложения. Хороший формат по умолчанию для строки контекста: `"[приложение] [временная метка коммита] [назначение]"`:
```rust
// 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`](https://github.com/blake3-team/blake3/blob/master/c/README.md).
### Другие реализации
Существует слишком много реализаций, чтобы уследить за всеми, но некоторые из них заслуживают внимания: [оптимизированная реализация на Go](https://github.com/zeebo/blake3), [привязки Wasm для Node.js и браузеров](https://github.com/connor4312/blake3), [бинарные колёса для Python](https://github.com/oconnor663/blake3-py), [привязки .NET](https://github.com/xoofx/Blake3.NET) и [чистая реализация на Java](https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/Blake3.html).
## Участие в разработке
Пожалуйста, смотрите [CONTRIBUTING.md](https://github.com/blake3-team/blake3/blob/master/CONTRIBUTING.md).
## Лицензии
Эта работа переведена в общественное достояние с помощью [CC0 1.0](https://github.com/blake3-team/blake3/blob/master/LICENSE_CC0). Альтернативно, она лицензирована под одной из следующих лицензий:
* [Apache 2.0](https://github.com/blake3-team/blake3/blob/master/LICENSE_A2)
* [Apache 2.0 with LLVM exceptions](https://github.com/blake3-team/blake3/blob/master/LICENSE_A2LLVM)
## Внедрение и использование
* [Bazel](https://github.com/bazelbuild/bazel/releases/tag/6.4.0)
* [Cargo](https://github.com/rust-lang/cargo/pull/14137)
* [Ccache](https://ccache.dev/releasenotes.html#_ccache_4_0)
* [Chia](https://github.com/Chia-Network/chia-blockchain/blob/main/CHANGELOG.md#10beta8-aka-beta-18---2020-07-16)
* [Clickhouse](https://github.com/ClickHouse/ClickHouse/blob/master/rust/chcache/Cargo.toml#L7)
* [Farcaster](https://www.farcaster.xyz/)
* [IPFS](https://github.com/ipfs/go-verifcid/issues/13)
* [Iroh](https://www.iroh.computer/blog/blake3-hazmat-api)
* [LLVM](https://reviews.llvm.org/D121510)
* [Nix](https://github.com/NixOS/nix/pull/12379)
* [Nym](https://github.com/nymtech/nym/blob/59056a22c5e6b01a38da2124662bd1fa3c8abef2/common/nymsphinx/params/src/lib.rs#L5)
* [OpenZFS](https://github.com/openzfs/zfs/)
* [Redox](https://www.redox-os.org/news/pkgar-introduction/)
* [Solana](https://docs.rs/solana-program/1.9.5/solana_program/blake3/index.html)
* [Tekken 8](https://x.com/rodarmor/status/1751567502050771189)
* [Wasmer](https://github.com/wasmerio/wasmer/blob/4f935a8c162bf604df223003e434e4f7ca253688/lib/cache/src/hash.rs#L21)
## Разное
- [@veorq] и [@oconnor663] дали [интервью Cryptography FM](https://cryptography.fireside.fm/3).
- [@oconnor663] дал [интервью Saito](https://www.youtube.com/watch?v=cJkmIt7yN_E).
[@oconnor663]: https://github.com/oconnor663
[@sneves]: https://github.com/sneves
[@veorq]: https://github.com/veorq
[@zookozcash]: https://github.com/zookozcash