
BLAKE3 v1.8.7
Funzione di hash crittografico veloce con modalità PRF, MAC, KDF e XOF. Supporta streaming verificato, aggiornamenti incrementali e hashing parallelizzato tramite struttura ad albero di Merkle.
BLAKE3
BLAKE3 è una funzione hash crittografica che è:
- Molto più veloce di MD5, SHA-1, SHA-2, SHA-3 e BLAKE2.
- Sicura, a differenza di MD5 e SHA-1. E sicura contro l'estensione di lunghezza, a differenza di SHA-2.
- Altamente parallelizzabile su qualsiasi numero di thread e vie SIMD, perché è un albero di Merkle all'interno.
- Capace di streaming verificato e aggiornamenti incrementali, ancora perché è un albero di Merkle.
- Una PRF, MAC, KDF e XOF, oltre a un hash normale.
- Un unico algoritmo senza varianti, che è veloce su x86-64 e anche su architetture più piccole.
Il grafico seguente è un esempio di benchmark con input di 16 KiB su una CPU server Cascade Lake-SP 8275CL del 2019. Per benchmark più dettagliati, consulta il paper su BLAKE3.
BLAKE3 si basa su un'istanza ottimizzata della consolidata funzione hash BLAKE2 e sulla modalità ad albero originale di Bao. Le specifiche e la logica di progettazione sono disponibili nel paper su BLAKE3. La dimensione di output predefinita è 256 bit. La versione corrente di Bao implementa lo streaming verificato con BLAKE3.
Questo repository è l'implementazione ufficiale di BLAKE3. Include:
-
La crate Rust
blake3, che include implementazioni ottimizzate per SSE2, SSE4.1, AVX2, AVX-512, NEON e WASM, con rilevamento automatico delle funzionalità CPU in fase di esecuzione su x86. La featurerayonfornisce multithreading. -
La crate Rust
b3sum, che fornisce un'interfaccia a riga di comando. Usa il multithreading di default, rendendolo un ordine di grandezza più veloce di ad esempiosha256sumsu hardware desktop tipico. -
L'implementazione C, che come l'implementazione Rust include ottimizzazioni SIMD (tutte tranne WASM), rilevamento delle funzionalità CPU su x86 e multithreading opzionale. Vedi
c/README.md. -
L'implementazione di riferimento Rust, discussa nella Sezione 5.1 del paper su BLAKE3. Questa implementazione è molto più piccola e più semplice di quelle ottimizzate sopra. Se vuoi capire come funziona BLAKE3, o stai scrivendo un porting che non necessita di multithreading o ottimizzazioni SIMD, inizia qui. I porting dell'implementazione di riferimento in altri linguaggi sono ospitati in repository separati (C, Python).
-
Un insieme di vettori di test che copre output estesi, tutte e tre le modalità e una varietà di lunghezze di input.
BLAKE3 è stato progettato da:
- @oconnor663 (Jack O'Connor)
- @sneves (Samuel Neves)
- @veorq (Jean-Philippe Aumasson)
- @zookozcash (Zooko)
Lo sviluppo di BLAKE3 è stato sponsorizzato da Electric Coin Company.
BLAKE3 è anche specificato nel Community Cryptography Specification Project (C2SP).
NOTA: BLAKE3 non è un algoritmo di hashing per password, perché è progettato per essere veloce, mentre l'hashing delle password non dovrebbe essere veloce. Se hashate le password per memorizzare gli hash o se derivate chiavi dalle password, raccomandiamo Argon2.
Utilizzo
L'utility b3sum
L'utility a riga di comando b3sum stampa gli hash BLAKE3 di file o dell'input
standard. I binari precompilati sono disponibili per Linux, Windows e
macOS (che richiede la soluzione per sviluppatore non
identificato)
nella pagina delle release.
Se hai installato Rust e
Cargo,
puoi anche compilare b3sum da te con:
cargo install b3sum
Se rustup non ha configurato il tuo PATH per te, potresti dover cercare
il binario installato in e.g. ~/.cargo/bin. Puoi testare
quanto è veloce BLAKE3 sulla tua macchina creando un file grande e
calcolandone l'hash, ad esempio:
# 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
La crate blake3 
Per utilizzare BLAKE3 da codice Rust, aggiungi una dipendenza alla crate blake3 nel
tuo Cargo.toml. Ecco un esempio di hashing di alcuni byte di input:
// 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);
Oltre a hash, BLAKE3 fornisce altre due modalità, keyed_hash e
derive_key. La modalità keyed_hash prende una chiave a 256 bit:
// 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);
La modalità derive_key prende una stringa di contesto e del materiale chiave (non una
password). La stringa di contesto dovrebbe essere hardcodata, globalmente unica e
specifica per l'applicazione. Un buon formato predefinito per la stringa di contesto è
"[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);
L'implementazione C
Vedi c/README.md.
Altre implementazioni
Ci sono troppe implementazioni là fuori per tenerne traccia, ma alcuni punti salienti includono un'implementazione Go ottimizzata, binding Wasm per Node.js e browser, wheel binari per Python, binding .NET e un'implementazione Java pura.
Contribuire
Si prega di vedere CONTRIBUTING.md.
Licenze
Quest'opera è rilasciata nel pubblico dominio con CC0 1.0. In alternativa, è concessa in licenza sotto una delle seguenti:
Adozione e distribuzione
- Bazel
- Cargo
- Ccache
- Chia
- Clickhouse
- Farcaster
- IPFS
- Iroh
- LLVM
- Nix
- Nym
- OpenZFS
- Redox
- Solana
- Tekken 8
- Wasmer
Varie
- @veorq e @oconnor663 hanno tenuto un'intervista con Cryptography FM.
- @oconnor663 ha tenuto un'intervista con Saito.