Base62 vs. Base64: Bezeichner sind keine beliebigen Byteströme

Erfahren Sie, warum die Base62-Alphabetreihenfolge und die Regeln für führende Nullen wichtig sind und wann Base64URL ein besseres Austauschformat ist.

Base62 verwendet üblicherweise Ziffern sowie Groß- und Kleinbuchstaben. Das macht es für kompakte Bezeichner ohne Satzzeichen attraktiv. Base64 verwendet 64 Symbole und packt Gruppen von Bits direkt. Obwohl die Namen ähnlich sind, modellieren Base62-Implementierungen die Eingabe häufig als Zahl, was unterschiedliche Fragen zur Interoperabilität aufwirft.

Die alphabetische Reihenfolge ist Teil des Formats

Zwei Base62-Bibliotheken können unterschiedliche Reihenfolgen für Ziffern, Großbuchstaben und Kleinbuchstaben wählen. Die gleiche sichtbare Zeichenfolge repräsentiert dann unterschiedliche Zahlen. Ein System, das verwendet 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ist nicht damit einverstanden, dass Kleinbuchstaben an erster Stelle stehen. Notieren Sie das Alphabet und die Testvektoren im Protokoll. „Base62“ allein reicht nicht aus.

Auch die Groß-/Kleinschreibung ist wichtig. Ein Kleinbuchstaben-Proxy, eine Datenbanksortierung ohne Berücksichtigung der Groß-/Kleinschreibung oder ein manuell normalisierter Bezeichner können seinen Wert ändern. Wenn Ihre Speicherschicht die Groß-/Kleinschreibung ignoriert, ist weder normales Base62 noch Base64 eine sichere Darstellung ohne eine zusätzliche Entwurfsentscheidung.

Behalten Sie die Länge beim Codieren von Bytes bei

Betrachten Sie zwei Dateien mit Hexadezimalzahlen 01 und 0001. Als vorzeichenlose Ganzzahlen interpretiert, haben beide den Wert Eins. Bei einer reinen Ganzzahl-zu-Base62-Konvertierung geht die Unterscheidung verloren. Ein byteorientiertes Base62-Format erfordert die explizite Behandlung führender Nullen oder ein Längenfeld. Dies ist insbesondere für zufällige Token und kryptografische Werte fester Länge relevant.

const a = BigInt('0x01');
const b = BigInt('0x0001');
console.log(a === b); // true: numeric equality loses byte length

Wählen Sie basierend auf der Bedeutung des Werts

Wenn Sie eine Datenbank-Ganzzahl unter der Kontrolle einer Anwendung kürzen, kann ein dokumentiertes Base62-Alphabet praktisch sein. Wenn Sie beliebige Bytes zwischen unabhängigen Systemen transportieren, bietet Base64URL normalerweise einen klareren standardisierten Vertrag. Es ersetzt Bindestriche und Unterstriche anstelle der standardmäßigen Interpunktion Base64 und behält dabei die gleiche Sechs-Bit-Gruppierung bei.

Kodierung ist keine Randomisierung. Sequentielle Ganzzahlen bleiben nach der Base62-Konvertierung vorhersehbar. Wenn Identifikatoren dem Erraten widerstehen müssen, müssen Sie mithilfe einer kryptografischen Zufallsquelle ausreichend unvorhersehbare Entropie erzeugen und dann die resultierenden Bytes ohne Längenverlust codieren. Betrachten Sie ein kompakt aussehendes Token nicht als Beweis dafür, dass seine Generierung sicher ist.

Berücksichtigen Sie beim Vergleich der Ausgabegrößen Präfixe, Padding-Regeln und alle Längenmetadaten. Prüfen Sie das Kodieren und anschließende Dekodieren mindestens mit einer leeren Eingabe, einem Nullbyte, mehreren führenden Nullbytes und einem Byte mit hohem Zahlenwert. Das Base64URL-Alphabet ist standardisiert in RFC 4648; Eine Base62-Anwendung muss die zusätzlichen Details selbst angeben.