التشفير في Rust: التشفير والتجزئة باستخدام مكتبات ring و sha2
لغة Rust اكتسبت سمعة كونها واحدة من أكثر لغات البرمجة أمانًا في برمجة الأنظمة. نظام الأنواع الصارم، وإدارة الذاكرة بدون جامع القمامة، والتكلفة الصفرية للتجريدات يجعلها خيارًا مثاليًا لتنفيذ الخوارزميات التشفيرية. في هذه المقالة، سنستعرض مكتبتين رئيسيتين للتشفير في Rust: ring (عالية المستوى، آمنة) و sha2 (تنفيذ نقي للتجزئة). ستتعلم كيفية إجراء التشفير المتماثل (AES-GCM) والتجزئة (SHA-256)، بالإضافة إلى التعرف على HMAC.
لماذا Rust للتشفير؟
يتطلب التشفير موثوقية لا هوادة فيها. تمنع Rust فئات كاملة من الثغرات الأمنية (تجاوز سعة المخزن المؤقت، سباقات البيانات) في مرحلة التجميع. تمت كتابة مكتبات ring و sha2 مع مراعاة هذه المبادئ ويتم دعمها بنشاط من قبل المجتمع.
- أمان الذاكرة — تضمن Rust أن المفاتيح والبيانات المشفرة لن يتم نسخها أو تركها في الذاكرة عن طريق الخطأ.
- الأداء — العمليات التشفيرية في Rust قابلة للمقارنة مع C/C++، وغالبًا ما تكون أسرع.
- سهولة الاستخدام — توفر المكتبات واجهة برمجة تطبيقات نظيفة مع الحد الأدنى من خطر الخطأ (على سبيل المثال، الإدارة التلقائية لـ nonce).
مكتبة ring: أداة شاملة
ring هي مكتبة تشفير متعددة المنصات تركز على الأمان والبساطة. تتضمن دعمًا لـ AES-GCM و ChaCha20-Poly1305 و ECDSA و Ed25519 والعديد من الخوارزميات الأخرى. لا تدعم ring البروتوكولات القديمة أو غير الآمنة، مما يحمي المطور من الاختيار العشوائي لتشفير ضعيف.
التثبيت:
[dependencies]ring = "0.17"مثال: تشفير وفك تشفير AES-GCM
يوفر AES-GCM (وضع العداد مع Galois) كلاً من السرية والمصادقة على البيانات. في المثال أدناه، نقوم بإنشاء مفتاح عشوائي و nonce، وتشفير رسالة، ثم فك تشفيرها بنجاح.
use ring::{aead, rand};use ring::rand::SecureRandom;
fn main() -> Result<(), Box<dyn std::error::Error>> { // إنشاء مفتاح عشوائي (256 بت) let rng = rand::SystemRandom::new(); let mut key_bytes = [0u8; 32]; rng.fill(&mut key_bytes)?; let key = aead::UnboundKey::new(&aead::AES_256_GCM, &key_bytes)?; let sealing_key = aead::SealingKey::new(key.clone()); let opening_key = aead::OpeningKey::new(key);
// البيانات المراد تشفيرها let plaintext = b"رسالة سرية لـ PythonLib"; let mut nonce_bytes = [0u8; 12]; // 96 بت لـ GCM rng.fill(&mut nonce_bytes)?; let nonce = aead::Nonce::assume_unique_for_key(nonce_bytes);
// التشفير (في نفس المكان) let mut ciphertext = plaintext.to_vec(); let tag = sealing_key.seal_in_place_separate_tag(nonce, aead::Aad::empty(), &mut ciphertext)?; ciphertext.extend_from_slice(tag.as_ref());
println!("مُشفّر: {:02x?}", ciphertext);
// فك التشفير let mut opened = ciphertext.clone(); let plaintext_len = opening_key.open_in_place(nonce, aead::Aad::empty(), &mut opened)?; let decrypted = &opened[..plaintext_len];
println!("مُفك تشفيره: {}", String::from_utf8(decrypted.to_vec())?); Ok(())}هام: يجب أن يكون Nonce (رقم يُستخدم مرة واحدة) فريدًا لكل عملية تشفير بنفس المفتاح. ring لا يُنشئ nonce تلقائيًا — هذه مسؤولية المطور. في المثال، نستخدم SystemRandom لإنشاء nonce عشوائي.
مكتبة sha2: تجزئة البيانات
sha2 هي تنفيذ نقي لعائلة تجزئة SHA-2 (SHA-224، SHA-256، SHA-384، SHA-512). توفر المكتبة واجهة برمجة تطبيقات بسيطة وآمنة لتجزئة البيانات. فيما يلي مثال على استخدام SHA-256:
use sha2::{Sha256, Digest};
fn main() { let data = b"مرحباً من PythonLib"; let hash = Sha256::digest(data); println!("تجزئة SHA-256: {:02x}", hash);}العمل مع HMAC
HMAC (رمز مصادقة الرسالة القائم على التجزئة) يُستخدم للتحقق من سلامة البيانات ومصادقتها. تدعم مكتبة ring HMAC مع خوارزميات تجزئة مختلفة مثل SHA-256.
use ring::hmac;
fn main() { let key = hmac::Key::new(hmac::HMAC_SHA256, b"مفتاح سري"); let signature = hmac::sign(&key, b"رسالة مهمة"); println!("HMAC: {:02x}", signature); // التحقق let result = hmac::verify(&key, b"رسالة مهمة", &signature); assert!(result.is_ok()); println!("التحقق ناجح!");}الخلاصة
توفر Rust مع مكتبات ring و sha2