अंतिम अक्षर के कुछ बिट डेटा नहीं होते
RFC 4648 §3.5 अनुरूप एन्कोडर को पैड बिट शून्य रखने को कहता है। एक बाइट इनपुट में दूसरे Base64 अक्षर के केवल ऊपरी दो बिट डेटा हैं; बाकी चार पैड बिट हैं। g का सूचकांक 32 यानी 100000 और h का 33 यानी 100001 है। f का बाइट 01100110 है और दोनों के डेटा बिट समान हैं। Zg== मानक आउटपुट है; Zh== में गैरशून्य पैड बिट हैं। अंत के = अक्षर और छोड़े गए बिट अलग हैं।
डिकोडिंग और फिर एन्कोडिंग जाँचें
WHATWG Infra की उदार Base64 डिकोडिंग शेष 12 बिट में अंतिम चार, या 18 बिट में अंतिम दो बिट छोड़ देती है। HTML atob यही प्रक्रिया उपयोग करता है। Moyoutil atob से बाइट निकालकर UTF-8 पाठ पढ़ता है। चलाए गए उदाहरणों में Zg== और Zh== दोनों f, Zm8= और Zm9= दोनों fo देते हैं। फिर एन्कोड करने पर Zg== और Zm8= मिले। नीचे का कोड मनमाने बाइनरी को UTF-8 पाठ में बदलने के बजाय बाइट को सीधे फिर एन्कोड करता है।
for (const input of ['Zg==', 'Zh==', 'Zm8=', 'Zm9=']) {
const bytes = atob(input);
const canonical = btoa(bytes);
console.log(input, bytes, canonical, input === canonical);
}
// Zg== f Zg== true
// Zh== f Zg== false
// Zm8= fo Zm8= true
// Zm9= fo Zm8= falseसमान बाइट और समान मूल स्ट्रिंग अलग शर्तें हैं। कैश कुंजी या तुलना के लिए ज़रूरी समानता तय करें। प्राप्तकर्ता प्रोटोकॉल मानक निरूपण माँगता है तो उसकी शर्तें जाँचें। हस्ताक्षर जाँचने से पहले स्ट्रिंग मनमाने ढंग से बदलना उचित नहीं है। यह तुलना केवल पैडिंग वाले मानक Base64 के लिए है, हर प्रोटोकॉल का सत्यापक नहीं।
अक्सर पूछे जाने वाले प्रश्न
क्या हर डिकोडर Zh== स्वीकार करता है?
नहीं। RFC 4648 गैरशून्य पैड बिट अस्वीकार करने की अनुमति देता है और संबंधित विनिर्देश व्यवहार तय कर सकता है। ये परिणाम HTML atob और वर्तमान Moyoutil कार्यान्वयन के हैं।