Entwicklertools · Base64-Encoder und -Decoder
Warum eingefügtes Base64 nicht dekodiert werden kann: Zeilenumbrüche, Zeilenumbrüche und Anführungszeichen
· Warum es wichtig ist
base64 Kodierung
Base64 bricht während des Transports selten ab; es bricht in der Zwischenablage. In diesem Beitrag werden die Fehler beim Kopieren und Einfügen aufgelistet, die zu Fehlern aufgrund ungültiger Zeichen und Längen führen, und wie man diese Fehler schnell erkennt.
Der Schlüssel, der im Terminal funktionierte, im Browser jedoch fehlschlug – ein unsichtbares Zeichen und eine zweistündige Suche
Ein Techniker hat einen API-Schlüssel von einem Terminal kopiert, um ihn in einem Skript zu testen. Der Schlüssel funktionierte im Terminal einwandfrei, schlug jedoch beim Einfügen in das Browser-Tool mit einem ungültigen Zeichen fehl. Zwei Stunden später, nachdem sie Code, Konfiguration und Dokumentation durchsucht hatten, entdeckten sie ein unsichtbares Zeichen. Eine neue Zeile am Ende des Schlüssels, die per Echo hinzugefügt oder aus einer Terminal-Eingabeaufforderungszeile kopiert wurde, wurde zu einem zusätzlichen Zeichen, das den Base64-Decoder kaputt machte. Der Schlüssel war korrekt; die Zwischenablage war es nicht. Base64-Daten sind zuverlässig, wenn sie elektronisch übertragen, mit Prüfsummen versehen und überprüft werden. Es bricht fast ausschließlich beim manuellen Kopieren und Einfügen ab.
Zeilenumbruch in Terminals, nachgestellte Zeilenumbrüche in der Befehlsausgabe, intelligente Anführungszeichenersetzung in Rich-Text-Editoren und versteckte Unicode-Zeichen beim Kopieren und Einfügen zwischen verschiedenen Anwendungen führen alle zu Fehlern, die aussehen, als wäre Base64 defekt, obwohl das eigentliche Problem darin liegt, wie es kopiert wurde. In diesem Beitrag werden die häufigsten Fehler aufgeführt und gezeigt, wie Sie jeden Fehler schnell erkennen und beheben können. Das Base64-Alphabet besteht aus Groß- und Kleinbuchstaben, Ziffern, Pluszeichen, Schrägstrichen und dem Füllzeichen (Gleichheitszeichen). RFC 4648 ist spezifisch: Eine Standard-Base64-Zeichenfolge enthält nur diese Zeichen plus optionales Leerzeichen, wenn Zeilen umbrochen werden.
Zeilenumbruch von Terminals, E-Mail-Clients und PEM-Formatierung – warum ein 76-Spaltenumbruch für einige Decoder in Ordnung und für andere fatal ist
Viele Tools tolerieren Abweichungen: Sie akzeptieren URL-sichere Varianten mit Bindestrichen und Unterstrichen anstelle von Plus und Schrägstrich oder sie ignorieren Zeilenumbrüche. Ein strikter Decoder, der dem RFC folgt, lehnt alles ab, was außerhalb des erwarteten Zeichensatzes liegt, und schlägt mit einem Fehler aufgrund eines ungültigen Zeichens fehl. Die Fehlermeldung nennt normalerweise das fehlerhafte Zeichen oder weist darauf hin, dass die Zeichenfolge überhaupt nicht dekodiert werden kann. Beim Einfügen von Base64 aus einer E-Mail, einem Terminal, einem Chatverlauf oder einem formatierten Dokument schleichen sich oft unsichtbare Zeichen oder Zeichenersetzungen ein und führen dazu, dass die Dekodierung fehlschlägt. Die Daten selbst sind in Ordnung; Die Übertragung in die Zwischenablage hat es beschädigt.
Zeilenumbruch ist die häufigste Ursache für Fehler beim Einfügen von Base64 und lässt sich auch am einfachsten beheben. Terminal-Tools brechen die Ausgabe mit 76 Zeichen pro Zeile oder manchmal 80 um, fügen eine neue Zeile ein und fahren mit der nächsten Zeile fort. Viele Encoder, einschließlich einiger Base64-Codierungsbibliotheken, umschließen ihre Ausgabe aus Gründen der Kompatibilität mit MIME-E-Mail an derselben 76-Zeichengrenze. Wenn Sie einen umschlossenen Base64-String von einem Terminal kopieren, kommen die Zeilenumbrüche mit.
Nachgestellte Zeilenumbrüche von Echo- und Zwischenablage-Tools – das zusätzliche Byte, das zu einem zusätzlichen Zeichen wird
Einige Decoder akzeptieren und ignorieren Zeilenumbrüche automatisch. Andere lehnen sie als ungültige Zeichen ab. Die Lösung besteht darin, alle Zeilenumbrüche und Leerzeichen zu entfernen. Wenn eine Base64-Zeichenfolge im Terminal über mehrere Zeilen umgebrochen wird, wählen Sie alle Zeilen aus, kopieren Sie sie in einen Editor und löschen Sie alle Zeilenumbrüche.
Kopieren Sie die resultierende einzeilige Zeichenfolge und fügen Sie sie in den Decoder ein. Dies ist das erste, was Sie versuchen sollten, wenn das Einfügen fehlschlägt. Nachgestellte Zeilenumbrüche von Echo- und Zwischenablage-Dienstprogrammen sind ein weiterer häufiger Übeltäter. Der Befehl echo $API_KEY gibt den Schlüssel gefolgt von einer neuen Zeile aus, was dem Standardverhalten des Befehls entspricht. Wenn Sie diese Ausgabe direkt kopieren, wird die neue Zeile in die Kopie einbezogen. Einige Terminals fügen beim Kopieren eine zusätzliche neue Zeile hinzu und einige Zwischenablage-Manager behalten oder duplizieren neue Zeilen. Das Symptom ist dasselbe wie beim Zeilenumbruch: ein zusätzliches Zeichen am Ende der Zeichenfolge, das nicht zu Base64 gehört.
Intelligente Anführungszeichen, geschützte Leerzeichen und Zeichen mit der Breite Null – wie Rich-Text-Editoren einfachen Text umschreiben
Die Lösung ist ebenso einfach: Schneiden Sie die Enden der eingefügten Zeichenfolge in Ihrem Editor ab, bevor Sie versuchen, sie zu dekodieren. Entfernen Sie führende und nachfolgende Leerzeichen sowie alle Zeichen, die wie Zeilenumbrüche aussehen. Wenn die Zeichenfolge kurz genug ist, können Sie sie erneut manuell eingeben. Bei langen Tasten geht das sorgfältige manuelle Zuschneiden jedoch schneller. Intelligente Anführungszeichen, geschützte Leerzeichen und andere Unicode-Ersetzungen sind subtile Fallen. Rich-Text-Editoren wie Word konvertieren automatisch gerade Anführungszeichen in geschweifte Anführungszeichen, wandeln drei Bindestriche in einen Gedankenstrich um und wandeln bestimmte Leerzeichenfolgen in geschützte Leerzeichen um. Wenn jemand einen Base64-String in ein Dokument einfügt und Sie ihn dann aus dem formatierten Dokument in ein Tool kopieren, kommt es zu diesen Ersetzungen.
Ein gerades doppeltes Anführungszeichen (") wird zu einem geschweiften linken und rechten Paar, von denen keines gültiges Base64 ist. Ein geschütztes Leerzeichen (U+00A0) sieht genauso aus wie ein normales Leerzeichen, hat aber einen anderen Zeichencode und wird nicht von allen Parsern als Leerzeichen erkannt. Die Lösung besteht darin, es zuerst in einen Nur-Text-Editor einzufügen, der alle Formatierungen verwirft. Wenn Sie aus einem Word-Dokument oder einem formatierten Chat einfügen, fügen Sie es zuerst in einen Nur-Text-Editor oder einen HTML-Textbereich ein und prüfen Sie, ob ungerade Zeichen vorhanden sind. Kopieren Sie dann die Nur-Text-Version, um sie in Ihrem Tool zu verwenden.
Kürzungs- und Auffüllverlust – die Längenmodulo-4-Prüfung, die Ihnen mitteilt, dass Zeichen fehlen
Das Abschneiden erfolgt, wenn eine Zeichenfolge beim Kopieren oder Einfügen abgeschnitten wird. Eine sehr lange Base64-Zeichenfolge kann auf einigen Systemen die Grenzen der Zwischenablage überschreiten oder aufgrund von Anwendungsfehlern nicht kopiert werden. Das Ergebnis ist eine kürzere Zeichenfolge, die unvollständig ist. Eine Base64-Zeichenfolge muss nach der Auffüllung eine Länge haben, die ein Vielfaches von vier ist. Wenn eine Länge kein Vielfaches von vier ist, wird sie abgeschnitten oder beschädigt. In der Fehlermeldung wird normalerweise darauf hingewiesen, dass die Zeichenfolgenlänge ungültig ist oder ein Zeichen fehlt. Für den Fix muss bekannt sein, was ursprünglich kopiert wurde.
Wenn Sie die Quelle noch einmal überprüfen können, kopieren Sie sie noch einmal sorgfältig. Andernfalls ist die Kürzung nicht wiederherstellbar. Der Verlust der Auffüllung ist ein damit zusammenhängendes Problem: Base64-Auffüllung mit Gleichheitszeichen wird manchmal entfernt, um ein paar Bytes zu sparen. Einige Anwendungen verzichten auf die Auffüllung, andere erfordern sie. Wenn eine Saite ursprünglich gepolstert war und die Polsterung verloren ging, fügen Sie sie wieder hinzu. Eine Base64-Zeichenfolge sollte 0, 1 oder 2 nachgestellte Gleichheitszeichen haben, sodass die Gesamtlänge ein Vielfaches von vier ist. Wenn keine vorhanden ist und die Länge kein Vielfaches von vier ist, ist möglicherweise die Polsterung verloren gegangen.
Arbeitsbeispiel: Reparieren einer umbrochenen und abgeschnittenen Zeichenfolge – Bereinigen Sie sie Schritt für Schritt, bis sie dekodiert ist
Ein ausgearbeitetes Beispiel zeigt diese Reparaturen Schritt für Schritt. Angenommen, ein kopierter API-Schlüssel erscheint in Ihrem Editor wie folgt: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0Cg==. Beginnen Sie mit der Identifizierung von Problemen. Das abschließende Cg== ist ungerade; Cg ist Base64 für ein Zeilenumbruchzeichen (hex 0A) und das Extra == deutet darauf hin, dass etwas hinzugefügt wurde. Entfernen Sie das nachgestellte Cg== und versuchen Sie es einfach mit VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0. Das ist immer noch nicht richtig; Die Länge beträgt 37 Zeichen, kein Vielfaches von vier. Erneut zuschneiden: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0 (35 Zeichen, immer noch falsch). Überprüfen Sie die Originalquelle. Die richtige Zeichenfolge ist VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0 (32 Zeichen) mit der richtigen Auffüllung: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0. Fügen Sie es hinzu: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0=.
Test im Decoder. Dies entschlüsselt zu Dies ist nicht wirklich ein Geheimnis. Verwenden Sie bei jedem Schritt den Base64-Encoder und -Decoder, um die aktuelle Zeichenfolge zu testen, das identifizierte Problem zu beheben und erneut zu testen, bis die Zeichenfolge dekodiert ist. Beschädigungen innerhalb der Base64-Bytes selbst können vom Decoder nicht behoben werden. Wenn die Bytes tatsächlich bei der Übertragung, Übertragung oder Speicherung beschädigt sind, kann Base64 selbst dies nicht erkennen. Der RFC gibt gültige Zeichen an; Jedes Zeichen außerhalb dieses Satzes muss vom Decoder abgefangen werden. Jede Bytebeschädigung, wie z. B. wenn 0 mitten in einem Base64-Zeichen zu 1 wird, erzeugt einen völlig anderen Zeichencode und ist für Base64 allein nicht erkennbar.
Was dies nicht abdeckt – Beschädigung innerhalb der codierten Bytes, die Base64 selbst nicht erkennen kann
Prüfsummen oder digitale Signaturen werden verwendet, um diese Art von Beschädigung zu erkennen, und sie müssen vor der Base64-Codierung anhand der ursprünglichen Binärdaten berechnet werden. Wenn Sie eine Base64-Zeichenfolge dekodieren und das Ergebnis fehlerhaft ist oder von Ihren Erwartungen abweicht, ist die Beschädigung vor der Kodierung oder während der Übertragung aufgetreten, nicht während des Kopieren-Einfügen-Schritts. Dies kommt in der Praxis selten vor. Bei den meisten Fehlern handelt es sich um Copy-Paste-Probleme wie die oben genannten. Ein systematischer Ansatz zum Debuggen von Base64-Copy-Paste-Fehlern besteht darin, jedes potenzielle Problem der Reihe nach zu testen. Entfernen Sie zunächst alle Leerzeichen und Zeilenumbrüche. Schneiden Sie dann führende und nachfolgende Leerzeichen sowie alle unnötigen Zeichen ab.
Überprüfen Sie dann die Modulo-Vier-Länge und fügen Sie bei Bedarf eine Auffüllung hinzu. Fügen Sie jede Version in den Base64-Encoder und -Decoder ein und prüfen Sie, ob sie dekodiert. Wenn die Längenprüfung fehlschlägt, fragen Sie, ob die Zeichenfolge abgeschnitten wurde, und rufen Sie sie aus der Originalquelle ab. Wenn die Alphabetprüfung fehlschlägt und Sie ungewöhnliche Zeichen sehen, suchen Sie nach Anführungszeichen oder Unicode-Ersetzungen und ersetzen Sie diese durch ASCII-Äquivalente. Verwenden Sie ein Online-Tool, das Ihnen ungültige Zeichen anhand des Namens anzeigt, damit Sie sie identifizieren und entfernen können. Der Base64-Encoder und -Decoder führt dies für jedes ungültige Zeichen durch und gibt genau an, welches Zeichen nicht im Alphabet enthalten ist.
Takeaway: Überprüfen Sie Länge und Alphabet, bevor Sie die Daten beschuldigen – wie der Base64-Encoder und -Decoder Ihnen einen schnellen lokalen Ort zum Testen jeder Reparatur bietet
Verwenden Sie dieses Feedback, um jedes Zeichen zu korrigieren und fortzufahren, bis die Zeichenfolge dekodiert wird. Vorbeugen ist einfacher als Debuggen. Wenn Sie wissen, dass Sie erneut eine Base64-Zeichenfolge benötigen, kopieren Sie sie so, dass die Formatierung erhalten bleibt. Fügen Sie es nicht in ein Rich-Text-Dokument ein. Speichern Sie es in einer Nur-Text-Datei oder einem dafür vorgesehenen Textbereich, der keine Ersetzungen vornimmt. Wenn Ihnen jemand eine Base64-Zeichenfolge in einer formatierten Nachricht sendet, bitten Sie ihn, diese im Codeformat oder im Klartext erneut zu senden. Wenn Sie aus einer formatierten Quelle kopieren müssen, fügen Sie die Zeichenfolge zunächst in einen Nur-Text-Editor ein und überprüfen Sie sie, bevor Sie sie verwenden.
Testen Sie die Zeichenfolge im Base64-Encoder und -Decoder, sobald Sie sie haben, bevor Sie sich darauf verlassen. Wenn dies fehlschlägt, können Sie eine neue Kopie anfordern, solange die Quelle noch zugänglich ist. Wenn Sie warten, bis die Zeichenfolge alt ist oder die Quelle nicht mehr vorhanden ist, ist es unmöglich, die Kürzung oder Beschädigung zu beheben. Der Base64-Encoder und -Decoder bietet Ihnen einen schnellen lokalen Ort, an dem Sie jede Zeichenfolge testen können, bevor Sie sie verwenden. Testen Sie frühzeitig und oft, damit Fehler beim Kopieren und Einfügen sofort erkannt werden.