
دالة تجزئة تشفيرية سريعة مع أوضاع PRF وMAC وKDF وXOF. تدعم التدفق المُتحقق منه، والتحديثات التزايدية، والتجزئة المتوازية عبر بنية شجرة ميركل.
BLAKE3 هي دالة تجزئة تشفيرية تتميز بما يلي:
يعد الرسم البياني أدناه مثالاً لمعيار أداء لمدخلات بحجم 16 كيلوبايت على معالج خادم Cascade Lake-SP 8275CL من عام 2019. للحصول على معايير أداء أكثر تفصيلاً، راجع ورقة BLAKE3.
تعتمد BLAKE3 على مثيل مُحسّن من دالة التجزئة المعروفة BLAKE2 وعلى وضع شجرة Bao الأصلي. المواصفات والأساس المنطقي للتصميم متوفرة في ورقة BLAKE3. حجم الإخراج الافتراضي هو 256 بت. الإصدار الحالي من Bao يطبق البث المُتحقق مع BLAKE3.
هذا المستودع هو التنفيذ الرسمي لـ BLAKE3. يتضمن:
حزمة Rust blake3، والتي تتضمن تطبيقات مُحسّنة لـ SSE2 وSSE4.1 وAVX2 وAVX-512 وNEON وWASM، مع اكتشاف تلقائي لميزات وحدة المعالجة المركزية في وقت التشغيل على x86. توفر ميزة rayon تعدد الخيوط.
حزمة Rust b3sum، والتي توفر واجهة سطر أوامر. تستخدم تعدد الخيوط افتراضيًا، مما يجعلها أسرع بدرجة كبيرة من مثل sha256sum على الأجهزة المكتبية النموذجية.
تطبيق C، والذي مثل تطبيق Rust يتضمن تحسينات SIMD (الكل باستثناء WASM)، واكتشاف ميزات وحدة المعالجة المركزية على x86، وتعدد الخيوط الاختياري. راجع c/README.md.
تطبيق Rust المرجعي، والذي تمت مناقشته في القسم 5.1 من ورقة BLAKE3. هذا التطبيق أصغر وأبسط بكثير من التطبيقات المُحسّنة أعلاه. إذا كنت تريد رؤية كيفية عمل BLAKE3، أو كنت تكتب نسخة منقولة لا تحتاج إلى تعدد الخيوط أو تحسينات SIMD، ابدأ من هنا. استضافت نسخ منقولة من التطبيق المرجعي إلى لغات أخرى في مستودعات منفصلة (C، Python).
مجموعة من متجهات الاختبار تغطي المخرجات الموسعة، وجميع الأوضاع الثلاثة، ومجموعة متنوعة من أطوال الإدخال.
صمم 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 لاستخدام 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 يأخذ سلسلة سياق وبعض المواد الرئيسية (ليست كلمة مرور). يجب أن تكون سلسلة السياق مشفرة بشكل ثابت، فريدة عالميًا، ومحددة بالتطبيق. تنسيق افتراضي جيد لسلسلة السياق هو "[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 مُحسّن، ارتباطات Wasm لـ Node.js والمتصفحات، عجلات ثنائية لـ Python، ارتباطات .NET، وتطبيق Java نقي.
يرجى الاطلاع على CONTRIBUTING.md.
هذا العمل متاح في المجال العام بموجب CC0 1.0. بدلاً من ذلك، يمكن ترخيصه بموجب أي من التراخيص التالية: