Einige Bits im letzten Zeichen enthalten keine Daten

RFC 4648 §3.5 verlangt, dass konforme Encoder Pad-Bits auf null setzen. Bei einem Eingabebyte enthalten nur die oberen zwei Bits des zweiten Base64-Zeichens Daten; die anderen vier sind Pad-Bits. g hat Index 32, 100000; h hat Index 33, 100001. Das Byte für f ist 01100110, und die Datenbits stimmen überein. Zg== ist die kanonische Ausgabe; Zh== enthält Pad-Bits ungleich null. Die abschließenden =-Zeichen sind nicht die verworfenen Bits.

Zg== und Zh== unterscheiden sich in den letzten vier Bits, ergeben aber dasselbe Byte f
Eigenes Bitdiagramm. Blau kennzeichnet Daten, Grau verworfene Pad-Bits. 01100110 steht für das öffentliche Beispiel f.

RFC 4648 §3.5, §4: Canonical Encoding / Base64

Decodieren und erneutes Codieren prüfen

Die tolerante Base64-Decodierung von WHATWG Infra verwirft die letzten vier Bits einer verbleibenden 12-Bit-Gruppe oder zwei einer 18-Bit-Gruppe. HTML atob verwendet dieses Verfahren. Moyoutil gewinnt Bytes mit atob zurück und interpretiert sie als UTF-8-Text. Unsere ausgeführten Beispiele lieferten für Zg== und Zh== jeweils f und für Zm8= und Zm9= jeweils fo. Erneutes Codieren ergab Zg== und Zm8=. Der folgende Code codiert Bytes direkt erneut, ohne beliebige Binärdaten in UTF-8-Text umzuwandeln.

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

Gleiche Bytes und gleiche ursprüngliche Zeichenfolgen sind unterschiedliche Bedingungen. Lege fest, welche Gleichheit Cache-Schlüssel oder Vergleiche brauchen. Verlangt das empfangende Protokoll kanonische Eingaben, prüfe dessen Regeln. Signierte Zeichenfolgen sollten vor der Prüfung nicht beliebig verändert werden. Dieser Vergleich gilt nur für Standard-Base64 mit Padding und ersetzt keinen allgemeinen Protokollvalidator.

WHATWG Infra: Forgiving base64 decode

WHATWG HTML: atob

Häufig gestellte Fragen

Akzeptiert jeder Decoder Zh==?

Nein. RFC 4648 erlaubt die Ablehnung von Pad-Bits ungleich null; eine darauf verweisende Spezifikation kann das Verhalten festlegen. Die Ergebnisse gelten für HTML atob und die aktuelle Moyoutil-Implementierung.