ring في Rust: دليل شامل مع أمثلة
ما هي مكتبة ring ولماذا تستخدمها؟
ring هي مكتبة تشفير (cryptographic library) للغة Rust، توفر تطبيقات آمنة ومختبرة وعالية الأداء لأساسيات التشفير. تعتمد على كود BoringSSL (فرع من OpenSSL من Google) وصُممت مع التركيز على الأمان وسهولة الاستخدام وتقليل مساحة الهجوم. على عكس المكتبات العامة مثل openssl أو rust-crypto، تحد ring عمدًا مجموعة الخوارزميات المدعومة، مستبعدةً الخوارزميات القديمة أو غير الآمنة (مثل DES وRC4 وMD5)، مما يقلل خطر استخدام تشفير ضعيف عن طريق الخطأ.
لماذا تحتاج ring؟ إذا كنت تطور تطبيقًا بلغة Rust يحتاج إلى التجزئة (SHA-256، SHA-512)، التشفير المتماثل (AES-GCM، ChaCha20-Poly1305)، التشفير غير المتماثل والتوقيعات (RSA، ECDSA، Ed25519)، توليد أرقام عشوائية، أو تبادل المفاتيح (X25519، ECDH)، فإن ring هي الخيار الأمثل. تُستخدم بنشاط في مشاريع مثل rustls (تطبيق TLS بلغة Rust)، reqwest (عميل HTTP)، وwebpki (التحقق من الشهادات). لا تتطلب المكتبة تبعيات خارجية (باستثناء libc على Linux/macOS) وتُترجم باستخدام Cargo، مما يجعلها مثالية للأنظمة المدمجة والتجميع المتقاطع (cross-compilation).
المزايا الرئيسية لـ ring: الأمان (تدقيق مستمر، عدم وجود خوارزميات غير آمنة)، الأداء (استخدام تعليمات التجميع المحسّنة من BoringSSL)، وبساطة واجهة API (أقل عدد من الأنواع والدوال، توثيق واضح). لا توفر ring تجريدات عالية المستوى مثل التعامل مع الشهادات أو البروتوكولات — فهناك كريتات منفصلة لذلك. بدلاً من ذلك، تقدم لبنات بناء يمكن دمجها بأمان.
التثبيت
لإضافة ring إلى مشروع Rust، نفّذ الأمر التالي في المجلد الرئيسي للمشروع:
cargo add ring
أو أضف يدويًا إلى ملف Cargo.toml:
[dependencies]
ring = "0.17"
الإصدار الحالي وقت كتابة هذا الدليل هو 0.17.x. تأكد من تثبيت Rust (rustc 1.70+). تتطلب ring وجود مترجم C (gcc، clang، أو msvc) لبناء المكونات الأصلية لـ BoringSSL. على Windows، قد تحتاج إلى تثبيت Build Tools for Visual Studio.
بداية سريعة — مثال عملي بسيط
أنشئ مشروعًا جديدًا واستبدل محتوى src/main.rs بالكود التالي، الذي يحسب تجزئة SHA-256 لنص:
use ring::digest::{Context, SHA256};
use ring::rand::SystemRandom;
fn main() {
// تجزئة SHA-256
let mut context = Context::new(&SHA256);
context.update("مرحبًا، ring!".as_bytes());
let digest = context.finish();
println!("SHA-256: {:?}", digest);
// توليد بايتات عشوائية
let rng = SystemRandom::new();
let mut random_bytes = [0u8; 32];
ring::rand::fill(&rng, &mut random_bytes).unwrap();
println!("البايتات العشوائية: {:02x?}", random_bytes);
}
شغّل البرنامج باستخدام الأمر cargo run. ستظهر لك تجزئة SHA-256 و32 بايتًا عشوائيًا بصيغة سداسية عشرية.
الدوال الأساسية
1. ring::digest::digest
التوقيع: pub fn digest(algorithm: &'static Algorithm, data: &[u8]) -> Digest
الوصف: تحسب تجزئة للبيانات data باستخدام الخوارزمية المحددة (SHA256، SHA384، SHA512، SHA1). هذه دالة تمريرة واحدة للحالات البسيطة.
use ring::digest::{digest, SHA256};
let data = b"Hello, world!";
let result = digest(&SHA256, data);
println!("التجزئة: {:?}", result);