التشفير في TypeScript: التشفير والتجزئة
تطوير الويب الحديث لا يمكن تصوره دون ضمان أمان البيانات. TypeScript، كإضافة صارمة التوصيف فوق JavaScript، يوفر للمطورين أدوات قوية لتنفيذ خوارزميات التشفير. في هذه المقالة، سنستعرض الطرق الرئيسية للتشفير والتجزئة المتاحة في نظام TypeScript، ونوضح كيفية تطبيقها عمليًا.
لماذا التشفير مهم في TypeScript؟
يُستخدم TypeScript على نطاق واسع لكل من الواجهة الأمامية والخلفية (عبر Node.js). في كلتا الحالتين، تنشأ الحاجة لحماية البيانات الحساسة: كلمات مرور المستخدمين، رموز المصادقة، محتوى الرسائل. بدون حماية تشفيرية مناسبة، يمكن اعتراض البيانات أو اختراقها.
يحل التشفير في TypeScript ثلاث مهام رئيسية:
- السرية — تشفير البيانات لمنع الغرباء من قراءتها.
- السلامة — ضمان عدم تغيير البيانات أثناء النقل.
- المصادقة — التحقق من صحة مصدر البيانات.
مكتبات التشفير الرئيسية لـ TypeScript
في TypeScript، يمكن استخدام كل من واجهات برمجة التطبيقات المدمجة في المتصفح والمكتبات الخارجية. دعنا نستعرض الخيارات الأكثر شيوعًا:
1. Web Crypto API (مدمج في المتصفح)
واجهة برمجة تطبيقات قياسية متاحة في المتصفحات الحديثة و Node.js (من الإصدار 15). لا تتطلب تثبيت حزم إضافية. تدعم AES، RSA، SHA وغيرها الكثير.
2. crypto (مكتبة Node.js)
وحدة مدمجة في Node.js توفر مجموعة واسعة من وظائف التشفير. لـ TypeScript، يلزم تثبيت الأنواع: npm install @types/node.
3. bcrypt / bcryptjs
مكتبة متخصصة لتجزئة كلمات المرور. يُوصى بها لتخزين كلمات مرور المستخدمين بفضل الحماية المدمجة بالملح.
4. tweetnacl / nacl
مكتبة للتشفير بالمفتاح العام (NaCl). تتميز بأداء عالٍ وسهولة في الاستخدام.
تشفير البيانات في TypeScript
دعنا نستعرض نوعين رئيسيين من التشفير: المتماثل (مفتاح واحد) وغير المتماثل (زوج مفاتيح).
التشفير المتماثل باستخدام AES-GCM
يوفر AES (معيار التشفير المتقدم) في وضع GCM كلاً من التشفير والتحقق من سلامة البيانات. مثال على التنفيذ في TypeScript باستخدام Web Crypto API:
// دالة تشفير AES-GCMasync function encryptAESGCM( plaintext: string, password: string): Promise<{ iv: Uint8Array; ciphertext: Uint8Array }> { const encoder = new TextEncoder(); const keyMaterial = await crypto.subtle.importKey( 'raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits', 'deriveKey'] );
const key = await crypto.subtle.deriveKey( { name: 'PBKDF2', salt: encoder.encode('my-salt'), iterations: 100000, hash: 'SHA-256', }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt'] );
const iv = crypto.getRandomValues(new Uint8Array(12)); const encrypted = await crypto.subtle.encrypt( { name: 'AES-GCM', iv }, key, encoder.encode(plaintext) );
return { iv, ciphertext: new Uint8Array(encrypted), };}
// مثال على الاستخدامconst { iv, ciphertext } = await encryptAESGCM('رسالة سرية', 'كلمة-المرور-الخاصة-بي');console.log('البيانات المشفرة:', ciphertext);التشفير غير المتماثل باستخدام RSA-OAEP
يستخدم RSA زوج مفاتيح: مفتاح عام للتشفير ومفتاح خاص لفك التشفير. مثال على توليد المفاتيح والتشفير:
// توليد زوج مفاتيح RSAasync function generateRSAKeyPair(): Promise<CryptoKeyPair> { return await crypto.subtle.generateKey( { name: