الانتقال من Node.js crypto إلى Web Crypto API: تجربة إرشادية
التعمق في تجربة الانتقال من crypto إلى Web Crypto API، وتقديم دليل شامل يركز على 3 سيناريوهات شائعة.
المقدمة
Web Crypto API هو أداة جافا سكريبت جديدة للتشفير. إنه متوافق مع المتصفحات الحديثة والمنصات الرائدة، بما في ذلك Cloudflare Workers و Vercel، وكذلك Node.js. تشير هذه التوافقية إلى حلم المطورين - كتابة شيفرة التشفير الخاصة بك مرة واحدة وتشغيلها عبر منصات عديدة باستخدام Web Crypto API.
ومع ذلك، يصبح لدى Node.js بالفعل وحدة "crypto" بتاريخ طويل، تاركًا كمية كبيرة من الشيفرة القديمة التي تحتاج إلى ترحيل. في هذا المقال، سنتعمق في تجربة الانتقال، ونقدم دليلاً شاملاً يركز على 3 سيناريوهات شائعة. نهدف إلى إلقاء الضوء على الطريق نحو ترحيل ناجح.
ما هو Web Crypto API
Web Crypto API، وهو معيار مفتوح من W3C لجافا سكريبت، هو مجموعة من الأساسيات القياسية للتشفير المعرفة في مواصفات Web Cryptography API. تم إنشاؤه بعد أن بدأت عدة متصفحات ومنصات في إضافة وظائف التشفير الخاصة بها والتي لا تتوافق.
توفر API أساسيات لتوليد المفاتيح، التشفير وفك التشفير، التواقيع الرقمية، اشتقاق المفاتيح والبت، وهضم التشفير. وهو يتركز حول واجهة تسمى SubtleCrypto، يمكنك العثور على مزيد من التفاصيل والدروس في وثائق Mozilla MDN.
ولكن لدى Node.js بالفعل وحدة crypto؟
عادة ما يكون مطورو Node.js على دراية بوحدة crypto. فهي تقدم مجموعة شاملة من الأساسيات التشفيرية. توفر هذه الوحدة آليات لأداء نفس العمليات التشفيرية المعرفة في Web Crypto API ولكنها غالباً ما تتضمن مجموعة أوسع من الخوارزميات التشفيرية.
فلماذا نحتاج إلى Web Crypto API إذاً؟ مع انتشار جافا سكريبت عبر العديد من المنصات والبيئات، من الجانب العميل إلى الخوادم وخاصة على الأطراف، من المهم أن يكون هناك أداة تشفير عبر المنصات لتبسيط العمليات.
بالإضافة إلى ذلك، تُعيد الوظائف في معيار Web Crypto API جميعها وعوداً وتدعم صيغة async/await. هذه ميزة كبيرة على وحدة crypto، التي تكون متزامنة ويمكن أن تعطل حلقة الحدث.
وهناك أمر مثير للاهتمام أن Node.js يضيف دعمها لـ Web Crypto API، مما يعني، في معظم الحالات، أن Web Crypto API مثالي في معظم المنصات المعروفة.
استخدام Web Crypto API
في معظم المنصات، يمكن الوصول إلى مجموعة Web Crypto API عبر الكائن العام crypto
، الذي يتضمن 3 أدوات في المستوى الأعلى: getRandomValues
, randomUUID
و subtle
.
هناك العديد من الاختلافات مقارنة بوحدة crypto التقليدية. يمكن تلخيصها في 3 أجزاء شائعة. دعونا نمر عليها ونرى كيفية الانتقال من الشيفرة الحالية.
#1 توليد قيم عشوائية
في وحدة crypto، يمكنك توليد قيم عشوائية بالاتصال بـ randomBytes
هناك دالة مشابهة تسمى getRandomValues
في Web Crypto، لكن القيمة المرجعة هي ArrayBuffer
، لذلك نحن بحاجة إلى خطوة أخرى لتحويلها إلى سلسلة.
#2 التجزئة (أو الهضم)
createHash
سهل الاستخدام في وحدة crypto:
في Web Crypto، يمكننا استخدام subtle.createHash
كما ترون، هناك أيضًا حاجة لتحويل ArrayBuffer
إلى سلسلة ستة عشرية.
#3 التشفير وفك التشفير
في وحدة crypto، يمكن تنفيذ التشفير وفك التشفير AES بـ:
في Web Crypto، نحتاج إلى إنشاء مفتاح بواسطة importKey
أولاً:
الخاتمة
كما ترى، فإن الانتقال ليس صعبًا، العمل الأساسي هو تغيير الصيغة لتتناسب مع API الجديد وحل مشكلة ArrayBuffer
باستخدام TextEncoder
.
كنشاط هوية، يستخدم Logto التشفير في العديد من الأماكن. لقد انتقلنا من وحدة crypto إلى Web Crypto API. يُمَكِّنُنا هذا الانتقال من التأقلم بشكل أفضل مع بيئات الأطراف ويتيح لنا تنفيذ شيفرة SDK بأمان في المتصفح.