
तेज़ क्रिप्टोग्राफ़िक हैश फ़ंक्शन PRF, MAC, KDF और XOF मोड के साथ। सत्यापित स्ट्रीमिंग, वृद्धिशील अपडेट और Merkle ट्री संरचना के माध्यम से समानांतर हैशिंग का समर्थन करता है।
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)।
परीक्षण वैक्टर का एक सेट जो विस्तारित आउटपुट, सभी तीन मोड, और विभिन्न इनपुट लंबाई को कवर करता है।
BLAKE3 को डिज़ाइन किया गया था:
BLAKE3 का विकास Electric Coin Company द्वारा प्रायोजित किया गया था।
BLAKE3 को Community Cryptography Specification Project (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 क्रेट 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। 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 के साथ सार्वजनिक डोमेन में जारी किया गया है। वैकल्पिक रूप से, यह निम्नलिखित में से किसी के तहत लाइसेंस प्राप्त है: