أدوات المطور · التشفير ووحدة فك التشفير Base64
شرح حشوة Base64: ماذا تعني العلامات = ومتى تكون مطلوبة
· كيف يعمل
base64 ترميز سير عمل المطور
إن = الموجود في نهاية سلسلة Base64 ليس زخرفة: فهو يسجل عدد البايتات التي كانت المجموعة الأخيرة قصيرة. يشرح هذا المنشور العمليات الحسابية، ولماذا لا تحتوي بعض السلاسل على أي شيء، ولماذا تختلف أجهزة فك التشفير حول الحشو المفقود.
استثناء "الحشوة غير الصحيحة" من الرمز المميز الذي يبدو جيدًا - فشل فك التشفير وحرف أو حرفين مفقودين خلفه
عندما تبلغ وحدة فك ترميز Base64 عن حشوة غير صحيحة، تبدو السلسلة مكتملة ولكنها تحمل خطأً بنيويًا. علامات التساوي ليست تجميلية: كل منها يشفر عدد البايتات التي كانت المجموعة النهائية قصيرة، مما يسمح لجهاز فك التشفير بمعرفة بالضبط متى انتهت البيانات الحقيقية. إن فهم هذه العلامات - ولماذا ترفض أجهزة فك التشفير الصارمة السلاسل بدونها - يحول خطأ غامضًا إلى عملية حسابية يمكن التنبؤ بها. قد يحتوي المقطع JWT على واحد =، أو لا شيء، أو اثنين. قد تنتهي استجابة API بشكل نظيف بدون الحشو.
وتمثل هذه الاختيارات المتعمدة، وليس متغيرات التنفيذ. لا تتطلب عملية فك التشفير الحشو ميكانيكيًا. الحشو موجود لجعل الإخراج لا لبس فيه: بالنظر إلى سلسلة Base64 فقط بدون بيانات وصفية حول الطول، يقرأ مفكك التشفير الحشو ويعرف بالضبط أين تنتهي البيانات. يقوم Base64 بتشفير مجموعات مكونة من ثلاث بايتات في أربعة أحرف. ثلاث بايتات هي 24 bits، ويتم إعادة تجميعها بشكل مثالي في أربعة مؤشرات ذات 6 بت؛ يختار كل منهم واحدًا من رموز 64 Base64. عندما لا يكون الإدخال مضاعفًا للثلاثة، يواجه جهاز التشفير بقايا: لا يمكن تقسيم بايت واحد أو بايتين بالتساوي على ثلاثة.
مجموعات مكونة من ثلاث بايتات، وكتل مكونة من أربعة أحرف - لماذا يقرر معامل طول الإدخال 3 ظهور علامات صفر أو واحد أو اثنين =
يقوم المشفر بتوسيع تلك المجموعات عن طريق تحويل البتات إلى المؤشرات الأولى، مما يترك النتائج النهائية صفرًا. لوضع علامة على هذا المتعمد، يتم إلحاق علامات =: صفر للمجموعات الكاملة، وواحد للنهائيات ذات بايتين، واثنتان للنهائيات ذات بايت واحد. الحساب حتمي: معرفة طول الإدخال بالبايت يتيح لك حساب المساحة المتروكة على الفور. بايت واحد ينتج حرفين Base64 بالإضافة إلى اثنين =. بايتان ينتجان ثلاثة أحرف بالإضافة إلى واحد =. ثلاث بايتات تنتج أربعة بدون حشوة.
أي إدخال ليس مضاعفًا لثلاث بايتات سيكون له حشوة؛ كل ما هو مضاعف لن يفعل ذلك. هذا ليس اختيارًا، بل هو حساب. يجب أن تمثل السلسلة التي لا تحتوي على حشوة ثلاث بايتات. السلسلة التي تحتوي على واحد يساوي يجب أن تمثل اثنين. الحشو يشفر طول الإدخال modulo ثلاثة. فحص تحويل ثلاثة مدخلات: واحد أ، زوج أب، ثلاثي أبك. ASCII a بايت 0x61؛ يقوم Base64 بتشفيرها كـ 0x61 00 00، مع إعادة التجميع إلى مجموعات مكونة من ستة بتات.
ما تحتويه البتات المتروكة ولماذا تتحقق منها وحدة فك التشفير الصارمة - البتات التي يجب أن تكون صفرًا وما يعنيه التشفير الأساسي
المؤشرات 24، 4، 0، 0 يتم تعيينها إلى Y، E، A، A. نظرًا لأن المجموعتين كانتا عبارة عن حشوة، يقوم المشفر بإلحاق علامتين =، مما يؤدي إلى إنتاج YQ==. بالنسبة إلى ab، تصبح البايتات 0x61 0x62 0x61 0x62 00. Bits أعيد تجميعها في الفهارس 24، 22، 8، 0، الإخراج YWI=. بالنسبة لـ abc، يتم إعادة تجميع وحدات البايت في الفهارس 24، 22، 9، 35، إخراج YWJj بدون حشوة. الحشو ليس اعتباطيًا: فهو يقع خارج تخطيط البت. عندما تقوم بفك تشفير سلسلة Base64، يقرأ جهاز فك التشفير كل حرف، ويبحث عن فهرسه المكون من ستة بتات، ويجمع البتات في بايت.
بالنسبة إلى YQ==، يتم تفكيك الأحرف Y وE وA وA إلى وحدات البت. إعادة التجميع إلى بايتات ذات ثمانية بتات يعطي بايت واحد، 0x61. يتجاهل جهاز فك التشفير بتات الحشو (الأصفار الزائدة) ويبلغ عن بايت واحد. تتحقق وحدة فك الترميز الصارمة من أن بتات الحشو هي في الواقع صفر؛ إذا لم يكن الأمر كذلك، فإن الإدخال لم يكن أساسيًا، مما يعني أن شخصًا ما تم تشفيره باستخدام تخطيط بت مختلف وفك تشفير أمر غامض. الأنظمة التي تحذف الحشو بالكامل تقوم بمقايضات متعمدة. تستخدم شرائح JWT Base64url بدون حشو، وتعتمد على معرفة المستهلكين لطول المخرجات المتوقع أو استنتاجه.
مثال عملي: تشفير "a" و"ab" و"abc" يدويًا — ثلاثة مدخلات وثلاث نتائج حشو، تظهر شيئًا فشيئًا
RFC 4648 يسمح بغياب الحشو ولكنه يوجه أجهزة فك التشفير لقبوله إذا كان موجودًا. تختلف مكتبات التعليمات البرمجية: بعضها سوف يستعيد المساحة المتروكة المفقودة ويستمر؛ سوف يفشل الآخرون. عندما تواجه رموزًا تفشل في فك التشفير، فإن إلحاق العدد الصحيح من العلامات = غالبًا ما يؤدي إلى إصلاح المشكلة. مطلوب = تكون العلامات دائمًا صفرًا أو واحدًا أو اثنين، اعتمادًا على طول السلسلة modulo four. إذا لم يكن طول سلسلة Base64 من مضاعفات الأربعة، فمن المؤكد أن المساحة المتروكة مفقودة أو تالفة.
لا يمكن أن يكون طول 5 صالحًا Base64: كل حرف كامل يشفر ستة بتات، لذلك تقوم أربعة أحرف بتشفير 24 bits (ثلاثة بايتات)، وخمسة ترميز 30 bits، وهو ليس من مضاعفات الثمانية ولا يمكن أن يصبح بايت. يجب على وحدة فك التشفير إما رفض هذا أو إضافة الحشو. إذا كان الطول 2 معياريًا 4، أضف اثنين =. إذا كان 3 modulo 4، أضف واحدًا =. إذا كان 0 modulo 4، فلا تقم بإضافة أي شيء. سلسلة بطول 3 لا تحتاج إلى =؛ أضف واحدًا ويصبح صالحًا قبل فك التشفير.
لماذا تقوم بعض الأنظمة بإسقاط الحشو بالكامل — JWT المقاطع و URL- الرموز المميزة الآمنة التي تحذف = وكيفية استعادتها من الطول
تسلسل سلسلتين مبطنتين من Base64 مكسورة إذا تركت الحشوة في مكانها. يتم ربط اثنين من التشفيرات المنفصلة بشكل مباشر لإنتاج أحرف حشو ضالة تكسر أبجدية فك التشفير. هذا هو السبب في أن بعض الأنظمة تزيل الحشو قبل التسلسل: الرمز المميز الذي يتكون من ثلاثة مقاطع Base64url متصلة بنقاط لا يحتوي على حشوة داخل المقاطع، مما يجعل التسلسل واضحًا. في حالة إنشاء قيمة Base64 من الأجزاء، تحقق مما إذا كان كل جزء مبطنًا ومقطعًا أو قم بإضافة الحشو بشكل متسق قبل أي عمليات.
يطبق برنامج التشفير ووحدة فك التشفير Base64 RFC 4648، والذي يتطلب الحشو بشكل افتراضي. عندما تقوم بإدخال نص وطلب إخراج base64، تنتج الأداة نتيجة مبطنة: النموذج الأساسي. إذا رأيت Base64 بدون حشوة وتريد فك تشفيرها، فتحقق مما إذا كانت وحدة فك الترميز لديك تقبل الحشو المفقود. تقبل الأداة كلاً من الإدخال المبطن وغير المبطن وتستعيد البايتات الأصلية بشكل صحيح. لتصحيح الأخطاء، يخبرك حساب الطول modulo four ما إذا كان قد تم تجريد الحشو، وتخبرك الصيغة بالحشو الذي يجب أن يكون موجودًا.
الأخطاء الشائعة: التشذيب = كما لو كانت مسافة بيضاء، أو ربط سلسلتين مبطنتين - كيف يفسد كل منهما فك التشفير
Base32 وBase16 (النظام الست عشري) لهما قواعد تعبئة مختلفة محددة في RFC 4648 القسمين 6 و7. يستخدم Base32 = ولكن المجموعة النهائية يمكن أن تكون 2، 4، 5، 7، أو 8 أحرف اعتمادًا على طول الإدخال modulo خمسة. لا يتطلب النظام السداسي العشري أي حشوة؛ يقوم دائمًا بتعيين بايت واحد إلى حرفين بدون باقي. MIME التفاف Base64 يمس الحشو: سلسلة ملفوفة ذات عمود 76 لا تزال تحتوي على حشوة في النهاية، بعد عدة أسطر فقط.
إن فهم الحشو لـ Base64 يدور حول فهم تخطيط البت وطول الإدخال modulo 3؛ بمجرد أن ترى العمليات الحسابية، تصبح الحشوة نتيجة مباشرة، وليست قاعدة يجب حفظها. الحشو مشتق وليس سحريًا.
ما لا يغطيه هذا — قواعد الحشو base32 وbase16، واصطلاحات طول الخط MIME
بالنظر إلى سلسلة Base64 بأي طول، يمكنك استعادة النموذج المبطن الأساسي عن طريق قسمة عدد الأحرف على أربعة، وأخذ الباقي، وإلحاق العدد المقابل من علامات =. هذا هو السبب في أن المفقود = قابل للإصلاح ولماذا يمكن أن تكون وحدات فك التشفير الصارمة متسامحة: الحشو يحمل معلومات (أي فرع من الحالات الثلاث التي وقع مدخلاتك فيها)، ولكن يمكن حساب هذه المعلومات من الطول وحده.
يُظهر برنامج التشفير ووحدة فك التشفير Base64 إخراجًا مبطنًا على الفور حتى تتمكن من مقارنة وحدات البايت التي تم فك تشفيرها بالنص الأصلي والتحقق من عمل الرحلة ذهابًا وإيابًا. يعمل Base64 والترميزات ذات الصلة على توسيع مبدأ إعادة تجميع البتات في عروض أحرف مختلفة. RFC 4648 يحدد الثلاثة، وفهم واحد يجعل الآخرين بسيطين من الناحية المفاهيمية. الفكرة الأساسية هي أن التشفير هو مجرد معالجة للبتات: اختر حجم الأبجدية الخاص بك، وقم بتجميع البتات الخاصة بك وفقًا لذلك، وابحث عن كل مجموعة في جدول.
الوجبات الجاهزة: الحشو قابل للاشتقاق، لذا فإن المفقود = يمكن إصلاحه - كيف يعرض لك برنامج التشفير ووحدة فك التشفير Base64 الشكل الأساسي المبطن لأي نص تقوم بتشفيره
عكس فك التشفير: ابحث عن كل حرف، واستخرج البتات، وأعد تجميعها، واكتب البايتات. هذا التعيين الحتمي ثنائي الاتجاه هو السبب وراء عمل Base64 بشكل موثوق عبر جميع الأنظمة الأساسية واللغات. غالبًا ما ترجع الأخطاء في التشفير وفك التشفير إلى سوء فهم الحشو أو الاختلافات الأبجدية. إذا فشل فك التشفير مع وجود أخطاء في الحشو، فتحقق مما إذا كانت وحدة فك التشفير تتوقع Base64 الأساسي (مبطن بشكل صارم) أو يقبل المتغيرات. إذا فشل مع وجود أخطاء في الأحرف، فتحقق مما إذا كان الإدخال هو base64url وأن وحدة فك الترميز تتوقع Base64 القياسي.
يقبل جهاز التشفير ووحدة فك التشفير Base64 كلاً من الحروف الهجائية ويتحقق من صحة الحشو باستمرار، لذلك يمكن التحقق من أي مثال محسوب يدويًا على الفور. يعد اختبار التشفير عن طريق فك تشفيره مرة أخرى أضمن طريقة لاكتشاف الأخطاء قبل أن تسبب مشاكل في الإنتاج.