Назад к обновлениям
New releaseAug 20, 2026

BLAKE3 v1.8.7

Быстрая криптографическая хеш-функция с режимами 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, так и на менее мощных архитектурах.

Приведённый ниже график является примером теста производительности для входных данных размером 16 КиБ на серверном процессоре Cascade Lake-SP 8275CL 2019 года. Более подробные тесты производительности см. в документе BLAKE3.

график производительности

BLAKE3 основана на оптимизированном экземпляре известной хеш-функции BLAKE2 и на оригинальном режиме дерева Bao. Спецификации и обоснование дизайна доступны в документе BLAKE3. Размер вывода по умолчанию — 256 бит. Текущая версия Bao реализует верифицированную потоковую передачу с BLAKE3.

Этот репозиторий является официальной реализацией BLAKE3. Он включает:

  • Крейт blake3 на Rust, который включает оптимизированные реализации для SSE2, SSE4.1, AVX2, AVX-512, NEON и WASM с автоматическим определением возможностей ЦП во время выполнения на x86. Функция rayon обеспечивает многопоточность.

  • Крейт b3sum на Rust, предоставляющий интерфейс командной строки. По умолчанию он использует многопоточность, что делает его на порядок быстрее, чем, например, sha256sum, на типичном настольном оборудовании.

  • Реализация на C, которая, как и реализация на Rust, включает SIMD-оптимизации (все, кроме WASM), определение возможностей ЦП на x86 и опциональную многопоточность. См. c/README.md.

  • Эталонная реализация на Rust, которая обсуждается в разделе 5.1 документа BLAKE3. Эта реализация значительно меньше и проще оптимизированных выше. Если вы хотите понять, как работает BLAKE3, или пишете порт, которому не нужны многопоточность или SIMD-оптимизации, начните отсюда. Порты эталонной реализации на другие языки размещены в отдельных репозиториях (C, Python).

  • Набор тестовых векторов, охватывающий расширенные выходные данные, все три режима и различные длины входных данных.

  • Actions Status

BLAKE3 была разработана:

Разработка BLAKE3 была спонсирована Electric Coin Company.

BLAKE3 также специфицирована в Проекте спецификаций криптографии сообщества (C2SP).

ПРИМЕЧАНИЕ: 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 docs.rs

Чтобы использовать BLAKE3 из кода на Rust, добавьте зависимость от крейта 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 принимает строку контекста и некоторый ключевой материал (не пароль). Строка контекста должна быть жёстко задана, глобально уникальна и зависеть от приложения. Хороший формат по умолчанию для строки контекста: "[приложение] [временная метка коммита] [назначение]":

// 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.

Другие реализации

Существует слишком много реализаций, чтобы уследить за всеми, но некоторые из них заслуживают внимания: оптимизированная реализация на Go, привязки Wasm для Node.js и браузеров, бинарные колёса для Python, привязки .NET и чистая реализация на Java.

Участие в разработке

Пожалуйста, смотрите CONTRIBUTING.md.

Лицензии

Эта работа переведена в общественное достояние с помощью CC0 1.0. Альтернативно, она лицензирована под одной из следующих лицензий:

Внедрение и использование

Разное

Категории