التشفير في TypeScript: التشفير والتجزئة — دليل شامل
تطوير الويب الحديث لا يمكن تصوره دون ضمان أمان البيانات. TypeScript، كإضافة فوق JavaScript، يوفر أدوات قوية لتنفيذ وظائف التشفير على جانب العميل والخادم (Node.js). في هذه المقالة، سنشرح بالتفصيل الأساسيات التشفيرية الرئيسية: التشفير المتماثل وغير المتماثل، والتجزئة، بالإضافة إلى العمل مع التوقيعات الرقمية. جميع أمثلة الأكواد مكتوبة بلغة TypeScript وجاهزة للاستخدام في المشاريع الحقيقية.
1. أساسيات التشفير في TypeScript
في نظام TypeScript، هناك نهجان رئيسيان للتشفير:
- Web Crypto API — واجهة برمجة تطبيقات مدمجة في المتصفحات و Node.js (بدءًا من الإصدار 15)، توفر وصولًا منخفض المستوى إلى العمليات التشفيرية.
- المكتبات الخارجية — مثل
crypto-js،node-forge،bcryptjsللمهام المحددة.
لتطوير الخادم باستخدام Node.js، يُوصى باستخدام الوحدة المدمجة crypto، والتي هي جزء من المنصة ولا تتطلب تثبيت تبعيات إضافية.
2. تجزئة البيانات
التجزئة هي تحويل أحادي الاتجاه للبيانات إلى طول ثابت. تُستخدم لتخزين كلمات المرور، والتحقق من سلامة الملفات، وإنشاء مجاميع اختبارية.
2.1. SHA-256 باستخدام Web Crypto API
async function hashSHA256(data: string): Promise<string> { const encoder = new TextEncoder(); const dataBuffer = encoder.encode(data); const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer); const hashArray = Array.from(new Uint8Array(hashBuffer)); return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');}
// مثال على الاستخدامconst myHash = await hashSHA256('مرحبًا بالعالم!');console.log(myHash); // 64 حرفًا سداسيًا عشريًا2.2. تجزئة كلمات المرور باستخدام bcrypt
لتخزين كلمات المرور بشكل آمن، استخدم خوارزميات متخصصة مع ملح، مثل bcrypt:
import bcrypt from 'bcryptjs';
async function hashPassword(password: string): Promise<string> { const salt = await bcrypt.genSalt(12); // 12 جولة — توازن جيد return await bcrypt.hash(password, salt);}
async function verifyPassword(password: string, hash: string): Promise<boolean> { return await bcrypt.compare(password, hash);}
// مثالconst password = 'MySecurePass!';const hashedPassword = await hashPassword(password);const isValid = await verifyPassword('MySecurePass!', hashedPassword);console.log(isValid); // true3. التشفير المتماثل
التشفير المتماثل يستخدم مفتاحًا واحدًا لتشفير وفك تشفير البيانات. الخوارزمية الأكثر حداثة وأمانًا هي AES-GCM، التي توفر السرية والمصادقة معًا.
3.1. تشفير وفك تشفير AES-GCM
interface EncryptedData { iv: Uint8Array; ciphertext: Uint8Array; tag: Uint8Array;}
async function encryptAESGCM( plaintext: string, key: CryptoKey): Promise<EncryptedData> { const encoder = new TextEncoder(); const data = encoder.encode(plaintext); const iv = crypto.getRandomValues(new Uint8Array(12)); // IV بحجم 96 بت const encrypted = await crypto.subtle.encrypt( { name: 'AES-GCM', iv }, key, data ); // GCM يضيف 16 بايت من علامة المصادقة في النهاية const ciphertext = new Uint8Array(encrypted.slice(0, encrypted.byteLength - 16)); const tag = new Uint8Array(encrypted.slice(encrypted.byteLength - 16)); return { iv, ciphertext, tag };}
async function decryptAESGCM( encrypted: EncryptedData, key: CryptoKey): Promise<string> { // دمج ciphertext و tag لـ Web Cry