Datei hochladen
  1. base64hub
  2. Base64 verstehen
  3. Base64-Standards und RFCs
Referenz

Base64-Standards: von PEM und MIME bis RFC 4648

Base64 hat keinen einzelnen Erfinder und keine einzelne Spezifikation. Es entstand 1987 aus sicherer E-Mail, wurde von MIME übernommen und erst 2003 eigenständig niedergeschrieben. Das sind die Dokumente, die es definieren, und die Varianten, die daraus hervorgingen.

Zeitleiste

JahrDokumentBeitrag
1987RFC 989 (PEM, Teil I)Die „druckbare Kodierung“ mit 64 Zeichen und =-Padding, dazu * für unverschlüsselte Abschnitte
1988, 1989RFC 1040, RFC 1113Überarbeitete PEM-Entwürfe
1992RFC 1341 (MIME)Base64 als Content-Transfer-Encoding für E-Mail
1993RFC 1421 (PEM), RFC 1521 (MIME)PEM-Zeilen mit genau 64 Zeichen, überarbeitetes MIME
1996RFC 2045 (MIME)Die bis heute gültige MIME-Definition: Zeilen mit höchstens 76 Zeichen
1997RFC 2152 (UTF-7)Base64 innerhalb einer Textkodierung für Unicode
2003RFC 3501 (IMAP4rev1)Modifiziertes Base64 mit , für Postfachnamen
2003RFC 3548Erste eigenständige Spezifikation: base64, base64url, base32, base16
2006RFC 4648Ersetzt RFC 3548, ergänzt base32hex und Testvektoren
2007RFC 4880 (OpenPGP)Radix-64-Armor mit CRC-24-Prüfsumme
2015RFC 7468Strenge Regeln für Zertifikats- und Schlüsseldateien im PEM-Stil
2015RFC 7515 (JWS)Base64URL ohne Padding für Tokens
2024RFC 9580 (OpenPGP)Ersetzt RFC 4880, erklärt die Armor-Prüfsumme für veraltet

PEM: wo Base64 begann

Das Alphabet, das wir heute verwenden, erschien zuerst in RFC 989, „Privacy Enhancement for Internet Electronic Mail“, veröffentlicht im Februar 1987. Verschlüsselte E-Mails mussten Gateways passieren, die nur druckbaren Text verarbeiteten, daher brauchte PEM einen Weg, binären Chiffretext mit Zeichen zu schreiben, die jedes Mailsystem überstehen. Es nahm jeweils 6 Bit und bildete sie auf A-Z, a-z, 0-9, + und / ab, mit = als Padding. Die Tabelle in RFC 989 ist identisch mit der Alphabet-Tabelle auf dieser Website. Außerdem reservierte es * zur Kennzeichnung unverschlüsselter Abschnitte, eine Funktion, die nicht überlebt hat.

PEM durchlief RFC 1040 und RFC 1113 und fand seine endgültige Form in RFC 1421 (Februar 1993), das die Zeilenlänge festlegte: Jede Zeile außer der letzten enthält „genau 64 druckbare Zeichen“, die letzte Zeile 64 oder weniger. Als Grund wurden das Drucken und das SMTP-Limit von 1000 Zeichen pro Zeile genannt. PEM als sicheres Mailsystem setzte sich nie durch, sein Dateiformat dagegen schon. Jeder Block -----BEGIN CERTIFICATE----- stammt davon ab, und RFC 7468 (2015) schreibt die Regeln heute ausdrücklich fest: Erzeuger müssen bei genau 64 Zeichen umbrechen, Parser dürfen andere Breiten akzeptieren. Solche Dateien untersuchen Sie mit dem Zertifikat-Decoder.

MIME: Base64 für jeden E-Mail-Anhang

MIME (RFC 1341 im Jahr 1992, RFC 1521 im Jahr 1993, RFC 2045 im Jahr 1996) brauchte einen Weg, Bilder und Dokumente in E-Mails unterzubringen, und übernahm die Kodierung von PEM. RFC 2045 ist bis heute die Referenz für E-Mail und unterscheidet sich in zwei Punkten von PEM:

  • Kodierte Zeilen dürfen nicht länger als 76 Zeichen sein und werden durch CRLF getrennt.
  • Zeichen außerhalb des Base64-Alphabets sind in Base64-kodierten Daten zu ignorieren. Decoder überspringen Zeilenumbrüche, Leerzeichen und alles andere, was nicht zum Alphabet gehört.

Die zweite Regel ist der Grund, warum so viele Decoder ungültige Zeichen stillschweigend verwerfen. Ausgabe im MIME-Stil erzeugen Sie mit dem MIME-Base64-Encoder, und unter Base64 in E-Mails sehen Sie, wie Anhänge aufgebaut sind.

RFC 3548 und RFC 4648: eine Referenz für alle

Bis 2003 verwies jedes Protokoll, das Base64 nutzte, auf MIME oder PEM und erbte deren Regeln für Zeilenlänge und tolerantes Dekodieren, ob es wollte oder nicht. RFC 3548 (Juli 2003) definierte base64, base64url, base32 und base16 als eigenständige Kodierungen. RFC 4648 (Oktober 2006) ersetzte es mit kleinen Änderungen: Es ergänzte base32hex, das die Sortierreihenfolge der kodierten Daten bewahrt, und eine Reihe von Testvektoren:

BASE64("")       = ""
BASE64("f")      = "Zg=="
BASE64("fo")     = "Zm8="
BASE64("foo")    = "Zm9v"
BASE64("foobar") = "Zm9vYmFy"

Die Regeln in RFC 4648 sind strenger als die von MIME, sofern die verweisende Spezifikation nichts anderes sagt:

  • Zeilenvorschübe: Implementierungen dürfen keine einfügen (Abschnitt 3.1).
  • Padding: Implementierungen müssen das =-Padding enthalten (Abschnitt 3.2).
  • Zeichen außerhalb des Alphabets: Decoder müssen sie ablehnen (Abschnitt 3.3).
  • Kanonische Kodierung: Encoder müssen ungenutzte Bits auf null setzen, und Decoder dürfen Eingaben ablehnen, bei denen das nicht der Fall ist (Abschnitt 3.5). Ohne diese Regel werden SGk/Pg== und SGk/Ph== beide zu Hi?> dekodiert.

Die Formulierung „sofern die Spezifikation, die auf dieses Dokument verweist, nicht ausdrücklich etwas anderes festlegt“ leistet viel. So darf JWS das Padding weglassen und MIME seine 76-Zeichen-Zeilen behalten, und beide verwenden trotzdem „Base64 nach RFC 4648“. Die Tools Base32 und Base16 implementieren die beiden anderen Kodierungen aus demselben RFC.

Varianten aus anderen Standards

JWS und JWT: Base64URL ohne Padding

RFC 7515 (Mai 2015) definiert BASE64URL(x) als das Alphabet aus Abschnitt 5, bei dem alle = am Ende weggelassen werden, ohne Zeilenumbrüche oder Leerraum. JWT, JWE, JWK und der größte Teil der JOSE-Familie verwenden das. Details unter Base64 in JWT.

IMAP: modifiziertes UTF-7 mit Komma

IMAP-Postfachnamen sind 7-Bit-Zeichenketten, daher kodiert RFC 3501 (Abschnitt 5.1.3) Ordnernamen mit Nicht-ASCII-Zeichen in „modifiziertem UTF-7“. Folgen von Nicht-ASCII-Zeichen werden in UTF-16 umgewandelt, ohne Padding und mit , statt / in Base64 kodiert und in & und - eingeschlossen. Das Beispiel aus dem RFC selbst, &U,BTFw-, ist der chinesische Name 台北, und ein deutscher Ordner Entwürfe wird zu Entw&APw-rfe. Einfaches UTF-7 (RFC 2152) schreibt denselben Namen als Entw+APw-rfe.

OpenPGP: Radix-64 mit CRC-24

Die ASCII-Armor von OpenPGP ist MIME-Base64 plus eine Prüfsummenzeile. RFC 4880 definiert eine CRC-24 (Generator 0x864CFB, Startwert 0xB704CE) über die Binärdaten, Base64-kodiert und mit vorangestelltem =. GnuPG erzeugt für die 12 Bytes Hello world! Folgendes:

-----BEGIN PGP ARMORED FILE-----
Comment: Use "gpg --dearmor" for unpacking

SGVsbG8gd29ybGQh
=s4Gu
-----END PGP ARMORED FILE-----

RFC 4880 erlaubt Zeilen mit bis zu 76 Zeichen; GnuPG schreibt 64. RFC 9580 (Juli 2024) behält das Format bei, sagt aber, dass die CRC-24-Zeile nicht erzeugt werden sollte („SHOULD NOT be generated“) und dass Implementierungen einen Block nicht ablehnen dürfen, weil sie fehlt oder falsch ist.

Tabelle der Base64-Varianten

VarianteIndex 62 und 63PaddingZeilenlängeDefiniert in
Standard-Base64+ /PflichtKeineRFC 4648, Abschnitt 4
Base64URL- _Optional, je nach verweisender SpezifikationKeineRFC 4648, Abschnitt 5
JWS / JWT- _NieKeineRFC 7515
MIME+ /PflichtHöchstens 76, CRLFRFC 2045
PEM+ /PflichtGenau 64RFC 1421, RFC 7468
OpenPGP-Armor+ /PflichtHöchstens 76 (GnuPG: 64)RFC 4880, RFC 9580
UTF-7+ /KeinsEntfälltRFC 2152
Modifiziertes UTF-7 (IMAP)+ ,KeinsEntfälltRFC 3501
bcryptAlphabet ./A-Za-z0-9KeinsEntfälltDe facto (OpenBSD)
crypt(3)-HashesAlphabet ./0-9A-Za-zKeinsEntfälltDe facto (Unix)

In den letzten beiden Zeilen ist das ganze Alphabet umgeordnet. Sie werden auf der Alphabet-Seite behandelt. Viele andere Formate verweisen auf eine der Zeilen oben, ohne etwas zu ändern: HTTP-Basic-Authentifizierung (RFC 7617), Data-URIs (RFC 2397), base64Binary aus XML Schema und Subresource-Integrity-Hashes verwenden alle Standard-Base64 mit Padding.

Häufige Fragen

Welches RFC definiert Base64?

RFC 4648 (Oktober 2006) ist die allgemeine Referenz. Es definiert base64, base64url, base32, base32hex und base16. Die MIME-Fassung steht in RFC 2045, das PEM-Original in RFC 1421.

Warum haben MIME-Zeilen 76 Zeichen und PEM-Zeilen 64?

Beide Grenzen halten die Zeilen deutlich unter dem Limit von 1000 Zeichen, das SMTP vorgibt. PEM legte in RFC 1421 genau 64 fest; MIME wählte in seiner eigenen Spezifikation „höchstens 76“. RFC 4648 sagt, dass Encoder überhaupt keine Zeilenumbrüche einfügen dürfen, sofern der verweisende Standard das nicht verlangt.

Ist Base64URL ein offizieller Standard?

Ja. Es ist Abschnitt 5 von RFC 4648, „Base 64 Encoding with URL and Filename Safe Alphabet“, und erschien zuerst in RFC 3548. JWS (RFC 7515) verwendet es ohne Padding.

Was ist die Zeile =XXXX am Ende eines PGP-Blocks?

Eine CRC-24-Prüfsumme der dekodierten Daten, selbst in Base64 geschrieben. RFC 9580 (2024) sagt, dass neue Implementierungen sie nicht mehr erzeugen sollen und einen Block ihretwegen nicht ablehnen dürfen.

Weiterlesen