Datei hochladen
  1. base64hub
  2. Base64 verstehen
  3. Häufige Base64-Präfixe
Referenz

Häufige Base64-Präfixe: eine Datei an ihrem Anfang erkennen

Die meisten Dateiformate beginnen mit festen Magic Bytes, also beginnt auch ihr Base64 mit festen Zeichen. Wer ein Dutzend Präfixe kennt, unterscheidet ein PNG von einem PDF, bevor überhaupt etwas dekodiert ist.

Tabelle der Präfixe

Jede Zeile wurde geprüft, indem die echten Magic Bytes des Formats kodiert wurden. Das „stabile Präfix“ ist der Teil, der sich für dieses Format nie ändert. Die Zeichen danach hängen vom Rest der Datei ab.

Base64-PräfixMagic Bytes (Hex)FormatÖffnen mit
iVBORw0KGgo89 50 4E 47 0D 0A 1A 0APNGBase64 in PNG
/9j/FF D8 FFJPEGBase64 in JPG
R0lGOD47 49 46 38 (GIF8)GIF (R0lGODlh = GIF89a, R0lGODdh = GIF87a)Base64 in GIF
UklGR52 49 46 46 (RIFF)WebP, WAV, AVIBase64 in WebP, Base64 in WAV
JVBERi025 50 44 46 2D (%PDF-)PDFBase64 in PDF
UEsDB50 4B 03 04 (PK..)ZIP, DOCX, XLSX, PPTX, JAR, APK, EPUBBase64 in ZIP, Word, Excel
H4sI1F 8B 08gzipgzip-Base64 dekodieren
eJ, eN, eF, eA78 9C, 78 DA, 78 5E, 78 01zlibzlib und Base64
eyJ7B 22 ({")JSON-Objekt, JWTBase64 in JSON, JWT-Decoder
PD94bWwg3C 3F 78 6D 6C 20 (<?xml )XML, SVG mit DeklarationBase64 in XML
PHN2Zy3C 73 76 67 20 (<svg )SVG ohne Deklaration (<svg plus Zeilenumbruch ergibt PHN2Zw)Base64 in SVG
MII30 82DER: Zertifikate, Schlüssel, CSRsZertifikat-Decoder
AAAA00 00 00SSH-Public-Key-Blob oder führende NullenSSH-Schlüssel-Fingerabdruck
SUQz49 44 33 (ID3)MP3 mit ID3v2-TagBase64 in MP3
AAABAA00 00 01 00ICOBase64 in ICO
d09GMg77 4F 46 32 00 (wOF2)WOFF2-Schrift mit TrueType-Konturen (CFF-Schriften beginnen mit d09GMk9UVE8)Base64 in Schrift
TVqQ4D 5A 90 (MZ)Windows-EXE oder -DLL (manche Linker schreiben MZP, das ergibt TVpQ)Base64 in Datei
f0VMR7F 45 4C 46 (.ELF)Linux-ELF-BinärdateiBase64 in Datei

Ein paar Zeilen verdienen eine Anmerkung:

  • RIFF ist ein Container. Der Formatname steht in den Bytes 8 bis 11, und die Bytes 9 bis 11 werden zum 13. bis 16. Zeichen kodiert: RUJQ für WebP (EBP), QVZF für WAV (AVE), Vkkg für AVI (VI ). Der erste Buchstabe des Formatnamens teilt sich eine 3-Byte-Gruppe mit der Dateigröße und ergibt daher kein stabiles Zeichen.
  • zlib hat kein einzelnes Präfix. Das zweite Byte hält die Kompressionsstufe fest: eJ für die Standardstufe, eN für die Stufen 7 bis 9, eF für 2 bis 5, eA für 0 und 1 (so, wie Pythons zlib sie schreibt).
  • JSON beginnt nur dann mit eyJ, wenn die ersten beiden Zeichen {" ohne Leerzeichen sind. { "a": 1 } beginnt mit eyAi, formatiertes { plus Zeilenumbruch mit ewo, und ein Array [ mit W.
  • DER-Strukturen beginnen mit dem SEQUENCE-Tag 30, das immer M ergibt. Eine Zwei-Byte-Länge (30 82) ergibt MII, und das nächste Zeichen folgt der Länge: Ein RSA-2048-Public-Key ist MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA, ein typisches Zertifikat MIIC, MIID oder MIIE. Kurze Strukturen verwenden eine Ein-Byte-Länge: Ein privater Ed25519-Schlüssel beginnt mit MC4C, ein P-256-Public-Key mit MFkw.
  • Öffentliche SSH-Schlüssel beginnen mit einer 4-Byte-Big-Endian-Länge, der Blob startet daher mit AAAA. Die folgenden Zeichen buchstabieren den Schlüsseltyp: AAAAC3NzaC1lZDI1NTE5 ist ssh-ed25519, AAAAB3NzaC1yc2E ist ssh-rsa, AAAAE2VjZHNh ist ecdsa. Außerhalb von SSH bedeutet eine Folge von A einfach Nullbytes.
  • MP3-Dateien ohne ID3-Tag beginnen direkt mit einem Frame-Header. Seine Sync-Bits FF Fx ergeben ein führendes //, zum Beispiel //uQ für FF FB 90.
  • Base64URL ersetzt + und /, daher wird das JPEG-Präfix zu _9j_. Die übrigen Präfixe in der Tabelle enthalten keines dieser Zeichen und sehen in beiden Alphabeten gleich aus.

Warum das Präfix stabil ist

Base64 arbeitet mit Gruppen von 3 Bytes. Jede Gruppe aus 3 Bytes wird zu genau 4 Zeichen, und diese 4 Zeichen hängen nur von diesen 3 Bytes ab. Nichts aus dem späteren Teil der Datei wirkt nach vorn zurück. Beginnt ein Format also immer mit denselben 3 Bytes, beginnt sein Base64 immer mit denselben 4 Zeichen.

bytes:   FF       D8       FF
bits:    11111111 11011000 11111111
groups:  111111 111101 100011 111111
index:   63     61     35     63
chars:   /      9      j      /

Ist die feste Signatur kein Vielfaches von 3 Bytes lang, mischt die letzte Gruppe bekannte Bits mit Bits aus dem Rest der Datei. Nehmen Sie das 5 Bytes lange %PDF-. Die ersten 3 Bytes ergeben 4 stabile Zeichen (JVBE). Die nächsten 2 Bytes ergeben 2 weitere (Ri), und das siebte Zeichen mischt die letzten 4 Bit von - mit den ersten 2 Bit der Versionsziffer. Jede Ziffer beginnt mit den Bits 00, in der Praxis ist dieses Zeichen also immer 0. Nach JVBERi0 scheint die Version durch: JVBERi0xLjQ ist %PDF-1.4, JVBERi0xLjc ist %PDF-1.7, JVBERi0yLjA ist %PDF-2.0.

Die PNG-Signatur hat 8 Bytes, was 10 stabile Zeichen ergibt. Das elfte mischt das letzte Signaturbyte mit dem ersten Byte der Länge des IHDR-Chunks, das immer 0 ist, daher gilt iVBORw0KGgo. Da jedes PNG mit diesem IHDR-Chunk weitergeht, teilen echte PNGs sogar ein noch längeres Präfix: iVBORw0KGgoAAAANSUhEUg.

Wenn sich das Präfix verschiebt

Das Präfix funktioniert nur, wenn die Magic Bytes an Position 0, 3, 6 und so weiter stehen. Ein Byte davor verschiebt jede Gruppe, und die Zeichen ändern sich vollständig:

EingabeBase64 beginnt mit
PNG-SignaturiVBORw0KGgoAAAA
1 Byte + PNG-SignaturAIlQTkcNChoKAAAA
2 Bytes + PNG-SignaturAACJUE5HDQoaCgAA
3 Bytes + PNG-SignaturAAAAiVBORw0KGgoA

Mit 3 zusätzlichen Bytes stimmt die Ausrichtung wieder, und das vertraute Präfix taucht 4 Zeichen später auf. Häufige Gründe für ein verschobenes oder fehlendes Präfix:

  • Eine Byte-Order-Mark. UTF-8-Text mit BOM beginnt mit 77u/ (EF BB BF). Die BOM hat 3 Bytes, nachfolgendes JSON zeigt also weiterhin eyJ: 77u/eyJ…. UTF-16-Text mit BOM beginnt mit //4 oder //5 (Little-Endian) oder /v8 (Big-Endian).
  • UTF-16-Text. Als UTF-16LE gespeicherter Text setzt hinter jedes ASCII-Zeichen ein Nullbyte, was viele A erzeugt: Hello wird zu SABlAGwAbABvAA==. PowerShells -EncodedCommand sieht so aus. Nutzen Sie den PowerShell-Decoder oder Base64 in UTF-16.
  • Kompression oder Verschlüsselung. Ein mit gzip komprimiertes PNG beginnt mit H4sI, eine verschlüsselte Datei hat überhaupt kein erkennbares Präfix.
  • Eine Data-URI. data:image/png;base64, ist ein Header, das Base64 beginnt nach dem Komma. Der Data-URI-Parser trennt beides für Sie.
  • Zeilenumbrüche und Leerraum. Sie verschieben die Bytes nicht, aber eine Präfixsuche mit startswith scheitert, wenn die Zeichenkette mit einem Zeilenumbruch oder einem Anführungszeichen beginnt. Kürzen Sie sie vorher oder schicken Sie sie durch Base64 reparieren.

Ein Präfix im Code prüfen

Man kann die ersten Zeichen als Zeichenketten vergleichen, der Vergleich dekodierter Bytes ist aber weniger fehleranfällig: Die Magic Numbers stammen direkt aus der Spezifikation des jeweiligen Formats, und man muss nie ausrechnen, welche Zeichen stabil sind. Dekodiert man nur die ersten 12 Zeichen, erhält man die ersten 9 Bytes, genug für die meisten Signaturen:

import base64

SIGNATURES = {
    b"\x89PNG\r\n\x1a\n": "png",
    b"\xff\xd8\xff": "jpeg",
    b"%PDF-": "pdf",
    b"PK\x03\x04": "zip",
    b"\x1f\x8b": "gzip",
}

def sniff(b64: str) -> str:
    head = base64.b64decode(b64.strip()[:12])
    for magic, name in SIGNATURES.items():
        if head.startswith(magic):
            return name
    return "unknown"

print(sniff("iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB"))  # png
print(sniff("JVBERi0xLjcKJcfsj6IK"))              # pdf

Das Tool Base64 in Datei führt dieselbe Prüfung mit einer längeren Liste durch und zeigt eine Vorschau, wenn der Browser das Format darstellen kann. Wie die 6-Bit-Gruppen auf Zeichen abgebildet werden, zeigen So funktioniert Base64 und die Alphabet-Tabelle.

Häufige Fragen

Was bedeutet eine Base64-Zeichenkette, die mit iVBORw0KGgo beginnt?

Es ist ein PNG-Bild. iVBORw0KGgo ist die Base64-Form der 8 Bytes langen PNG-Signatur 89 50 4E 47 0D 0A 1A 0A. Fügen Sie die Zeichenkette in Base64 in PNG ein, um das Bild zu sehen.

Was bedeutet /9j/ am Anfang einer Base64-Zeichenkette?

Ein JPEG. Die Bytes FF D8 FF, mit denen jede JPEG-Datei beginnt, werden zu /9j/ kodiert. In Base64URL schreibt sich dasselbe Präfix _9j_.

Warum beginnen JWTs immer mit eyJ?

Der Header eines JWT ist ein JSON-Objekt und beginnt daher mit {", und diese zwei Bytes werden zu eyJ kodiert. Der Payload-Teil beginnt aus demselben Grund mit eyJ.

Mein Base64 passt zu keinem bekannten Präfix. Was nun?

Die Daten haben vielleicht zusätzliche Bytes am Anfang, sind komprimiert oder verschlüsselt oder einfacher Text. Das Tool Base64 in Datei dekodiert die Daten und prüft die Bytes gegen viele Signaturen.

Weiterlesen