العربية

أدوات المطور · التشفير ووحدة فك التشفير Base64

RFC 4648 موضح: المعيار الذي يحدد Base64 وbase32 وbase16

· خلفية

base64 ترميز

RFC 4648 العائلات الأبجدية: base64، base64url، base32، base32hex، base16
الرسم التوضيحي المتجه الأصلي ToolAcre

RFC 4648 هو المستند القصير والمقروء وراء كل تطبيق Base64. تتناول هذه المقالة ما تحدده، وما تتركه مفتوحًا عمدًا، ولماذا لا تزال عمليات التنفيذ مختلفة.

مكتبتان، وإجابتان لنفس السلسلة - لغز قابلية التشغيل البيني الحقيقي الذي لا يحله إلا المعيار

يمكن لمكتبتين JavaScript إرجاع Base64 مختلف لنفس السلسلة، كل منها تدعي صحتها. RFC 4648 هو مستند قابل للقراءة مكون من اثنتي عشرة صفحة ينبغي أن يحل مثل هذه الخلافات، ومع ذلك لا تزال عمليات التنفيذ تختلف لأن RFC يترك قرارات معينة للطلبات عمدًا. تتناول هذه المقالة ما يحدده RFC 4648، وما يفوضه عمدًا إلى المتصلين، ولماذا تؤدي قراءة المعيار مرة واحدة إلى حل معظم ألغاز إمكانية التشغيل التفاعلي الحقيقية. تشتمل أداة التشفير وفك التشفير Base64 على RFC 4648 متجهات اختبار حتى تتمكن من التحقق من التنفيذ مقابل الأمثلة الموثوقة.

RFC 4648 استبدلت ودمجت العديد من المستندات السابقة: Base64 من MIME (RFC 2045)، Base64 من البريد المحسّن للخصوصية (RFC 1421)، base32 من S/MIME (RFC 2630) وbase16 من مصادر مختلفة. كان الدمج ضروريًا لأن MIME وPEM كان لكل منهما أبجدية وقواعد خاصة بهما، وMIME يتعارض التفاف الأسطر مع كتل الأعمدة PEM الخاصة بـ 64. RFC 4648 يحدد خمس عائلات ترميز في مكان واحد: base64، وbase64url، وbase32، وbase32hex، وbase16، ولكل منها أبجديتها الخاصة وقواعد الحشو وأمثلة متجهات الاختبار. الأبجدية الأساسية 64 هي A-Z، a-z، 0-9، بالإضافة إلى الشرطة المائلة، بهذا الترتيب.

ما تحدده متجهات التنفيذ والاختبار — الحروف الهجائية القياسية وURL الآمنة، والحشو، والتعامل مع المسافات البيضاء

يمثل كل حرف 6 bits؛ يتم تعيين ثلاث بايتات إدخال (24 bits) إلى أربعة أحرف إخراج. الأبجدية ليست عشوائية: فهي تتجنب الأحرف التي تختلف بين EBCDIC وASCII، وتتجنب أحرف التحكم وعلامات الاقتباس والشرطة المائلة العكسية التي قد تحتاج إلى الهروب في حرفية سلسلة C. يستبدل متغير base64url علامة الزائد بشرطة وشرطة مائلة بشرطة سفلية لتجنب الأحرف المحجوزة في عناوين URL وأسماء الملفات. كلا الخيارين صالحان بنفس القدر؛ RFC 4648 القسم 2 يحدد base64، القسم 5 يحدد base64url، ويجب أن يحدد التطبيق التطبيق الذي يستخدمه.

يؤدي الحشو باستخدام أحرف متساوية إلى جلب الإخراج إلى عدة أحرف مكونة من أربعة أحرف. إذا كان الإدخال 1 byte (8 bits)، فسيكون الإخراج حرفين بالإضافة إلى علامتي يساوي. إذا كان الإدخال 2 bytes (16 bits)، فسيكون الإخراج ثلاثة أحرف بالإضافة إلى علامة يساوي واحدة. إذا كان الإدخال من مضاعفات 3 bytes، فلا حاجة إلى الحشو. تحذف بعض التطبيقات الحشو أو تسمح بحشو مفقود عند فك التشفير؛ RFC 4648 القسم 3.2 يعرّف التشفير المتعارف عليه على أنه مبطن دائمًا، لكن القسم 3.3 يشير إلى أن أجهزة فك التشفير قد تقبل الحشو المفقود من أجل التوافق.

الحروف الهجائية التي تنفذها هذه الأداة - Base64 القياسي وBase64url؛ وتبقى القواعد الأخرى خارج نطاقها

إن التمييز في الحشو هو سبب اختلاف التطبيقات: يرفض مفكك التشفير الصارم المتساويات المفقودة، في حين يقبلها مفكك التشفير المتساهل. RFC 4648 يقول بوضوح: عادةً ما يتم ترميز حرف اللوحة يساوي بنسبة مئوية عند استخدامه في عناوين URL، لذلك إذا تم استخدام إخراج base64url مباشرة في معلمة URL، فإن الحشو غير مطلوب ويجب حذفه. هذه الجملة هي أحد أسباب URL- غالبًا ما يتم إقران الوضع الآمن وحذف الحشو، على الرغم من أنهما اختياران مستقلان. القسم 5 (base64url) لا يمنع الحشو؛ إنه يشير فقط إلى الممارسة الشائعة.

يجب على المتصل الذي يختار base64url أن يقرر ما إذا كانت الحشوة مطلوبة لنظام الاستقبال. يتم التعامل مع الأحرف غير الأبجدية في الإدخال بشكل مختلف بواسطة أجهزة فك التشفير المختلفة. ينص القسم RFC 4648 3.1 على أن عمليات التنفيذ MUST ترفض الترميز إذا كان يحتوي على أحرف خارج الأبجدية الأساسية. ومع ذلك، يشير القسم 3.3 إلى أن MIME Base64 (RFC 2045) يسمح بفواصل الأسطر لالتفاف الأحرف 76، ويجب على وحدات فك ترميز MIME تخطي المسافات البيضاء. يميز RFC بين فك التشفير الصارم (رفض كل الحروف غير الأبجدية) وفك التشفير المتوافق مع MIME (تخطي المسافات البيضاء، ورفض الأحرف الأخرى).

الحشو والأحرف غير الأبجدية والتشفير الأساسي - الأقسام التي تشرح معظم الخلافات في وحدة فك التشفير

يجب أن يختار التطبيق القاعدة التي يجب اتباعها؛ يحدد المعيار كليهما. يستخدم Base32 A-Z و2-7 (إجمالي 32 أحرف)، وترميز خمس بايتات إدخال (40 bits) إلى ثمانية أحرف إخراج. بدائل Base32hex 0-9 وa-v للأحرف الأبجدية، مفيدة في السياقات التي تُفضل فيها الأحرف الصغيرة.

Base16 هو نظام سداسي عشري: 0-9 وa-f. Base32 وbase32hex لهما قواعد الحشو الخاصة بهما في الأقسام 6 و7، ويوفر RFC متجهات اختبار منفصلة لكل أبجدية. يحتاج معظم المطورين إلى base64 وbase64url فقط؛ تم تضمين base32 وbase32hex وbase16 في RFC للاكتمال وللتطبيقات مثل TOTP الأسرار (RFC 4226) وترميز DNS.

خيارات التطبيق مرئية في هذا التنفيذ - التفاف الأسطر، وفك تشفير النص الصارم، ومعالجة الأخطاء

تمثل متجهات الاختبار في RFC 4648 الحقيقة الأساسية للتحقق من التنفيذ. يؤدي تشفير السلاسل f وfo وfoo وfoob وfooba وfoobar إلى إنتاج مخرجات base64 محددة: Zg== وZm8= وZm9v وZm9vYg== وZm9vYmE= وZm9vYmFy. التطبيق الذي ينتج مخرجات مختلفة لهذه السلاسل غير صحيح. يوفر RFC متجهات اختبار مكافئة لـ base32 وbase32hex وbase16. تتضمن أداة التشفير وفك التشفير Base64 هذه المتجهات حتى تتمكن من التحقق من مخرجاتها مقابل المعيار. يعد التفاف الأسطر مشكلة MIME، وليست مشكلة Base64.

RFC 2045 يحدد 76 أسطر الأحرف؛ RFC 4648 القسم 3.1 يشير إلى ذلك في سياق MIME لكنه لا يجعله أحد متطلبات Base64 نفسه. تحتوي بعض التطبيقات على 64 من الأحرف (المعيار الأصلي PEM)؛ والبعض الآخر لا يلتف على الإطلاق. يعمل جهاز فك ترميز Base64 الصارم RFC 4648 على الحروف الأبجدية والحشو فقط. يجب على وحدة فك الترميز المتوافقة مع MIME تخطي فواصل الأسطر (CR، LF، CRLF). يجب ألا يضيف التطبيق الذي يستخدم base64 خارج MIME فواصل أسطر إلا إذا طلبها نظام الاستقبال؛ لا يحدد RFC التفاف السطر كجزء من base64.

مثال عملي: متجهات الاختبار الخاصة بـ RFC — تشفير بادئات 'foobar' والتحقق منها في المتصفح

تعد معالجة المسافات البيضاء نقطة أخرى لتباين التنفيذ. RFC 4648 ينص على أن وحدات فك التشفير الصارمة يجب أن ترفض الأحرف غير الأبجدية. MIME-مغلف base64 (RFC 2045 base64) يسمح بمسافة بيضاء للتنسيق. يتفق المعياران على ما يجب أن تكون عليه بايتات الإخراج ولكنهما يختلفان حول المدخلات الصالحة. تختار معظم تطبيقات JavaScript التوافق MIME وتتخطى المسافات البيضاء؛ نادرًا ما يتم استخدام القاعدة الصارمة في المتصفحات. يقبل برنامج التشفير ووحدة فك التشفير Base64 كلاً من المدخلات التي تحتوي على مسافة بيضاء (MIME) والمدخلات الصارمة، مما يجعل التمييز واضحًا. يعد فك التشفير الكنسي مقابل فك التشفير المتسامح هو التباين الرئيسي الأخير.

يتبع فك التشفير الأساسي RFC 4648 القسم 3.2: رفض الحشو المشوه، ورفض الحشو المفقود، ورفض الأحرف غير الأبجدية. فك التشفير المتسامح، المستخدم في معايير الويب (تطلق عليه المواصفات HTML اسم مسامح-base64)، يضيف قواعد: تجاهل المسافة البيضاء، وقبول الحشو المفقود، والسماح بالشرطة والشرطة السفلية كمكافئات للشرطة المائلة حتى في وضع base64 القياسي. JavaScript atob() متسامح؛ يعد جهاز فك التشفير الصارم RFC 4648 أكثر صرامة. لا يوجد خطأ. أنها تخدم سياقات مختلفة. يجب أن يعرف التطبيق الذي يقرأ البيانات من المستخدم أو من الشبكة القاعدة التي يتوقعها الجانب الآخر.

ما لا يغطيه هذا — المستندات MIME وPEM نفسها، وواجهات برمجة التطبيقات الخاصة باللغة

يترك RFC تسعة اختيارات للتطبيق: أي من الحروف الهجائية الخمس، سواء كان يتطلب الحشو أو يسمح به، سواء كان يتطلب مسافة بيضاء أو يسمح بها، سواء كان يجب التعامل مع الشرطة السفلية المتقطعة كمكافئات للشرطة المائلة، وكيفية الإبلاغ عن الأخطاء، وكيفية التعامل مع نهاية الإدخال، وما إذا كان سيتم قبول الحشو المفقود، وعدد بايتات الإخراج المراد تخصيصها، وكيفية الإشارة إلى حد الحجم. تشرح هذه الاختيارات سبب اختلاف تطبيقي RFC 4648 على نفس الإدخال. اقرأ RFC مرة واحدة؛ التحقق من التنفيذ الخاص بك مقابل متجهات الاختبار الخاصة به؛ حدد الخيارات التي يستخدمها تطبيقك؛ اختبار قابلية التشغيل البيني مع النظير الفعلي، وليس الافتراضات.

يؤدي فهم RFC 4648 إلى تسوية معظم نزاعات Base64 لأن الخلاف عادة لا يكون حول RFC نفسه ولكن حول الخيارات التي اختارها كل جانب. إن RFC مختصر بما يكفي لقراءته من البداية إلى النهاية خلال ساعة واحدة. يحدد المعيار الحروف الهجائية، ويوفر متجهات الاختبار، ويحذر من المكان الذي يجب أن تقرر فيه عمليات التنفيذ. تتيح لك أداة التشفير وفك التشفير Base64 تجربة ناقلات الاختبار ورؤية الأبجدية القياسية أثناء العمل. لا يتطلب معظم استخدام Base64 اليومي معرفة عميقة RFC؛ ولكن عند تصحيح أخطاء عدم تطابق التشفير أو التكامل مع API غير مألوف، فإن قراءة المعيار مرة واحدة تزيل التخمين.

الوجبات الجاهزة: اقرأ المعيار مرة واحدة - كيف يوفر لك برنامج التشفير ووحدة فك التشفير Base64 طريقة سريعة للتحقق من متجهات اختبار الأبجدية القياسية

RFC 4648 هو دمج عقود من ممارسة التشفير الأساسي المخصص في مواصفات واحدة قابلة للقراءة. لا يحدد متى يتم استخدام base64 (MIME، PEM، JWT، معرفات URI للبيانات، وما إلى ذلك، لكل منها مواصفاته الخاصة)؛ فهو يحدد ما هو base64. من خلال تحديد خمس عائلات ترميز وملاحظة الخيارات الأساسية، فإن RFC يجعل من الممكن التحقق مما إذا كان التنفيذ صحيحًا. تمثل متجهات الاختبار الموثوقة نقطة البداية: إذا كان تطبيقك يقوم بتشفير foobar وينتج أي شيء آخر غير Zm9vYmFy، فإن RFC يشير إلى أن التنفيذ خاطئ.

استخدم هذا المرجع كنقطة تحقق للتحقق: قم بتشفير كل متجه اختبار RFC، وقارن الأحرف الدقيقة، ثم قم بفك تشفير النتيجة للتأكد من أن البايتات الأصلية تعود دون تغيير. يقوم هذا الفحص المستند إلى المستعرض بفصل الخطأ الأبجدي أو خطأ الحشو عن مشكلة أخرى في أي مكان آخر في عملية التكامل، مع الاحتفاظ بالمعيار نفسه كمرجع بدلاً من الاعتماد على تسمية المكتبة.