انتقل إلى المحتوى
HexaTransfer
العودة إلى المدونة
التشفير والأمان

مكتبات تشفير JavaScript: أفضل الخيارات للمطورين

قارن أفضل مكتبات تشفير JS لتطبيقات الويب. من tweetnacl إلى libsodium.js، اعثر على المكتبة المناسبة.

أفضل مكتبات تشفير JavaScript لنقل الملفات في 2026 هي: libsodium.js للتغطية الواسعة وسرعة WASM، و@noble/ciphers و@noble/curves للتطبيقات البرمجية النقية مع عمليات تدقيق حديثة، وtweetnacl لصغر حجم الحزمة مع توافق NaCl، وcrypto-js للتوافق مع الكود القديم (تجنّبه في المشاريع الجديدة)، وأخيراً Web Crypto API الأصلية لكل ما يدعمه. يقارن هذا الدليل هذه المكتبات من حيث تغطية الخوارزميات وحجم الحزمة وتاريخ التدقيق وتوافق المتصفح مقابل Node والأداء الفعلي لعبء العمل في تشفير الملفات. يعتمد الاختيار الصحيح على ما إذا كنت ترسل إلى متصفحات أو تبني على Node أو تحتاج ChaCha20-Poly1305 أو Argon2، أو تستطيع العيش ضمن حدود Web Crypto.

جدول المقارنة

| المكتبة | الحجم (مضغوط) | النواة | الخوارزميات الرئيسية | مدققة | حديثة؟ | |---|---|---|---|---|---| | Web Crypto API | 0 KB (أصلية) | أصلية في المتصفح | AES-GCM، PBKDF2، RSA، ECDH، HMAC | نعم (من مورّدي المتصفح) | نعم، لكن بدون ChaCha/Argon2 | | libsodium.js | 200 KB WASM / 400 KB JS | WASM + JS احتياطي | كل ما في libsodium | نعم (متعددة) | نعم | | @noble/ciphers | 8 KB | JS نقية | AES، ChaCha20، Poly1305، GCM-SIV | نعم (Cure53 2023) | نعم | | @noble/curves | 35 KB | JS نقية | Ed25519، X25519، secp256k1، BLS | نعم (Trail of Bits، Cure53) | نعم | | tweetnacl | 15 KB | JS نقية | Curve25519، Ed25519، XSalsa20-Poly1305 | نعم (تدقيق NaCl الأصلي) | غالباً، تفتقر إلى ChaCha20 | | crypto-js | 50 KB | JS نقية | AES-CBC، SHA، HMAC، PBKDF2 | لا يوجد تدقيق حالي | لا، متوقفة منذ 2023 | | node:crypto | 0 KB (أصلية Node) | أصلية Node (OpenSSL) | شاملة | نعم (OpenSSL) | نعم |

libsodium.js: السكين السويسري

libsodium.js (البناء المُجمَّع بـ Emscripten من libsodium) هو الخيار الافتراضي حين لا تكفي Web Crypto. يغطي XChaCha20-Poly1305 وEd25519 وX25519 وArgon2id وBLAKE2b وواجهة crypto_secretstream للتشفير المصادَق (AEAD) المتدفق. بناء WASM يعمل بنحو 50-70% من سرعة libsodium الأصلية على الأجهزة المعتادة.

import _sodium from 'libsodium-wrappers';
await _sodium.ready;
const sodium = _sodium;

const key = sodium.crypto_secretstream_xchacha20poly1305_keygen();
const { state, header } = sodium.crypto_secretstream_xchacha20poly1305_init_push(key);
const chunk = sodium.crypto_secretstream_xchacha20poly1305_push(
  state, new Uint8Array([1,2,3]), null,
  sodium.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE
);

واجهة البث (streaming API) هي الميزة القاتلة لنقل الملفات الكبيرة. تستطيع تشفير ملف بحجم 5 جيجابايت مقطعاً مقطعاً دون تحميله كله في الذاكرة، ويحمل كل مقطع وسم مصادقة خاصاً به لاكتشاف التلف لكل مقطع وليس فقط في النهاية.

المقايضات: 200 KB WASM حجم كبير للشحن. استخدم الاستيراد الديناميكي (await import('libsodium-wrappers')) ليُحمَّل المكتبة عند الحاجة الفعلية للتشفير فقط. البناء الشامل (يضم كل الخوارزميات) 600 KB+؛ التزم بالبناء الافتراضي ما لم تحتج الإضافات.

@noble: صغير ومدقَّق وحديث

عائلة @noble من Paul Miller (@noble/ciphers، @noble/curves، @noble/hashes) هي أفضل خيار حالي لمشفَّرات JavaScript النقية. مدقَّقة من Cure53 (ciphers، 2023) وTrail of Bits (curves، 2022)، بلا تبعيات، قابلة للهزّ من الشجرة (tree-shakeable)، أصلية في TypeScript.

import { gcm } from '@noble/ciphers/aes';
import { randomBytes } from '@noble/ciphers/webcrypto';

const key = randomBytes(32);
const nonce = randomBytes(12);
const ciphertext = gcm(key, nonce).encrypt(plaintext);

لا تستخدم @noble تقنية WASM، لذا أثرها على الحزمة صغير (8 KB للمشفَّرات). أداؤها أبطأ بنسبة 30-50% من WASM الخاص بـ libsodium لعمليات AES-GCM الضخمة، لكنه كافٍ لمعظم سيناريوهات النقل. يعمل نهج JavaScript النقي بشكل متطابق في المتصفحات وNode وDeno وBun وReact Native دون قلق بشأن الوحدات الأصلية.

استخدم @noble حين يهم حجم الحزمة، أو حين تريد مكتبة JS نقية قابلة للهزّ، أو على منصات يكون فيها WASM صعباً.

tweetnacl: النهج التقشفي

tweetnacl-js ينقل مكتبة TweetNaCl C لـ Daniel J. Bernstein إلى JavaScript. 15 KB مضغوطاً. يغطي تبادل مفاتيح Curve25519 وتوقيعات Ed25519 والتشفير المصادَق XSalsa20-Poly1305. مدقَّق ضمن جهد NaCl الأصلي وإن لم يكن مدققاً حديثاً.

import nacl from 'tweetnacl';

const key = nacl.randomBytes(32);
const nonce = nacl.randomBytes(24);
const ciphertext = nacl.secretbox(plaintext, nonce, key);

الواجهة صغيرة عمداً: إن احتجت أكثر مما تقدمه NaCl (مثلاً AES-GCM للتشغيل البيني مع أنظمة غير JS)، فابحث في مكان آخر. للتطبيقات النقية بروتوكول NaCl لا يزال tweetnacl خياراً معقولاً، وإن كانت @noble/ciphers مع @noble/curves تغطي نفس الأرضية بصيانة أحدث.

crypto-js: لا تستخدمها في الكود الجديد

هيمنت crypto-js على تشفير المتصفح في 2015. في 2026 أصبحت عبئاً. آخر إصدار مهم كان 2021 (4.1.1)؛ المستودع أُرشف فعلياً عام 2023. تعتمد افتراضياً على AES-CBC مع اشتقاق مفاتيح ضعيف من كلمات المرور (بنمط OpenSSL EVP_BytesToKey)، يشتق المفاتيح عبر بضع جولات MD5. أشار CVE-2023-46233 إلى إعدادات PBKDF2 ضعيفة.

إن كنت تصون كوداً قديماً يستخدم crypto-js، الانتقال إلى @noble/ciphers أو Web Crypto أمر يستحق الجهد. إن بدأت مشروعاً جديداً في 2026، تجنّب crypto-js كلياً.

node:crypto لكود الخادم

وحدة crypto المدمجة في Node تلف OpenSSL وتوفر أوسع تغطية خوارزميات من بين كل ما في هذه القائمة. على Node 18+، تكشف require('crypto').webcrypto واجهة متوافقة مع Web Crypto، فيعمل الكود المشترك (isomorphic) على الخادم والعميل.

import { createCipheriv, randomBytes } from 'crypto';

const key = randomBytes(32);
const iv = randomBytes(12);
const cipher = createCipheriv('aes-256-gcm', key, iv);
const ct = Buffer.concat([cipher.update(plaintext), cipher.final()]);
const tag = cipher.getAuthTag();

لفكّ تشفير ملفات مُشفَّرة بـ Web Crypto على الخادم هذا أنظف مسار. إن كانت خدمة نقل الملفات لديك تفكّ التشفير من جانب الخادم (نادر في التصاميم ذات المعرفة الصفرية لكن شائع في الأنظمة القديمة المنتقلة إلى التشفير)، استخدم node:crypto.

الأداء في تشفير الملفات الفعلي

مقاييس أداء على MacBook Air M2 لتشفير مخزن مؤقت بحجم 100 ميجابايت بـ AES-256-GCM:

  • Web Crypto API (Chrome 120): 340 مللي ثانية (مُسرَّع بالأجهزة)
  • Web Crypto API (Safari 17): 280 مللي ثانية (مُسرَّع بالأجهزة على Apple Silicon)
  • libsodium.js WASM: 420 مللي ثانية
  • @noble/ciphers: 1,850 مللي ثانية (بلا تسريع أجهزة في JS النقية)
  • tweetnacl (XSalsa20): 1,200 مللي ثانية
  • node:crypto: 180 مللي ثانية (OpenSSL الأصلي)

الخلاصة: Web Crypto تفوز للملفات الكبيرة لاستخدامها AES-NI. JavaScript النقية تناسب البيانات الصغيرة لكن تضيف ثوانٍ لعمليات النقل بالجيجابايت. لرفع 5 جيجابايت، الفرق بين Web Crypto و@noble/ciphers قد يعني دقيقتَين مقابل عشر دقائق من وقت التشفير.

تجزئة كلمات المرور: Argon2 لا بديل

PBKDF2 الحد الأدنى المطلوب لكن Argon2id أفضل. الخيارات:

  • argon2-browser: تطبيق مرجعي مُجمَّع بـ WASM، 200 KB
  • @noble/hashes: Argon2id JS نقية، 15 KB، أبطأ لكن نقية
  • libsodium.js: Argon2id عبر crypto_pwhash، 200 KB لكن مدرجة أصلاً إن كنت تستخدم libsodium

استخدم Argon2id بـ 3 تكرارات على الأقل و64 ميجابايت ذاكرة و4 توازٍ لمفاتيح التشفير المشتقة من كلمات المرور في سياقات المتصفح (إرشادات OWASP 2024).

الاختيار حسب بيئتك

  • تبني نقل ملفات بسيطاً بتشفير AES-GCM: استخدم Web Crypto مباشرةً بلا مكتبة. HexaTransfer يتبع هذا النهج.
  • تحتاج ChaCha20-Poly1305 أو AEAD متدفق: libsodium.js.
  • قلق من WASM أو تشحن لحزم محدودة: @noble/ciphers + @noble/curves.
  • تستخدم مفاتيح بروتوكول NaCl (مثلاً صناديق مغلقة لاستقبال الملفات المشفَّرة): @noble أو libsodium، وليس crypto-js.
  • تنتقل من crypto-js: انتقل إلى @noble إن كان حجم الحزمة مهماً، وإلا إلى libsodium.js.
  • تحتاج توقيعات ما بعد الكم أو KEM: لا توجد مكتبة JS ناضجة بعد؛ تحقق من @noble/post-quantum (في مرحلة ما قبل الإصدار مطلع 2026).

إشارات التدقيق والصيانة

قبل اعتماد مكتبة تشفير، تحقق من:

  • تاريخ آخر إيداع (أي تأخر يتجاوز 18 شهراً محفوف بالمخاطر)
  • تقارير التدقيق العامة (Cure53 وTrail of Bits وNCC Group)
  • متتبع المشكلات للقضايا الأمنية غير المحلولة
  • عدد التبعيات (أقل يعني سطح هجوم أصغر)
  • التنزيلات الأسبوعية على npm (أعلى يعني مزيداً من العيون على الكود)

شهد النظام البيئي لـ JavaScript حوادث سلسلة توريد (event-stream وua-parser-js وcolors) تجعل تقليل التبعيات خاصيةً أمنية. مكتبات التشفير التي لا تعتمد على أي تبعيات وقت التشغيل (عائلة @noble وtweetnacl) أسهل للتدقيق من طرف إلى طرف من تلك التي تجلب متعددات وأدوات مساعدة.

جرّبها على hexatransfer.com — مجاني، بدون حساب، حتى 10 جيجابايت.

أرسل ملفات كبيرة بأمان مع تشفير من طرف إلى طرف

انقل ملفات حتى 10 جيجابايت مجاناً مع تشفير من طرف إلى طرف. لا حاجة لحساب. يتم تشفير ملفاتك في متصفحك قبل الرفع — لا أحد آخر يستطيع قراءتها.

إرسال ملف