Base62 vs Base64 : les identifiants ne sont pas des flux d'octets arbitraires

Découvrez pourquoi l'ordre alphabétique Base62 et les règles de zéro non significatif sont importants, et quand Base64URL est un meilleur format d'échange.

Base62 utilise généralement des chiffres et des lettres majuscules et minuscules. Cela le rend attrayant pour les identifiants compacts sans ponctuation. Base64 utilise 64 symboles et regroupe directement des groupes de bits. Bien que les noms soient similaires, les implémentations Base62 modélisent souvent l'entrée sous forme de nombre, ce qui crée différentes questions d'interopérabilité.

L'ordre alphabétique fait partie du format

Deux bibliothèques Base62 peuvent choisir des ordres différents pour les chiffres, les lettres majuscules et les lettres minuscules. La même chaîne visible représente alors des nombres différents. Un système utilisant 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz n'est pas d'accord avec celui qui place les lettres minuscules en premier. Enregistrez l'alphabet et les vecteurs de test dans le protocole ; « Base62 » seul ne suffit pas.

La sensibilité à la casse est également importante. Un proxy en minuscules, un classement de base de données insensible à la casse ou un identifiant normalisé manuellement peut modifier sa valeur. Si votre couche de stockage ignore la casse, ni Base62 ordinaire ni Base64 ne constituent une représentation sûre sans une décision de conception supplémentaire.

Préserver la longueur lors du codage des octets

Considérons deux fichiers contenant des valeurs hexadécimales 01 et 0001. Interprétés comme des entiers non signés, les deux ont la valeur un. Une simple conversion d’entier vers Base62 perd la distinction. Un format Base62 orienté octet nécessite une gestion explicite des zéros non significatifs ou un champ de longueur. Ceci est particulièrement pertinent pour les jetons aléatoires et les valeurs cryptographiques de longueur fixe.

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

Choisissez en fonction de la signification de la valeur

Si vous raccourcissez un entier de base de données sous le contrôle d’une application, un alphabet Base62 documenté peut être pratique. Si vous transportez des octets arbitraires entre des systèmes indépendants, Base64URL fournit généralement un contrat standardisé plus clair. Il remplace le tiret et le trait de soulignement par la ponctuation standard Base64 tout en conservant le même regroupement de six bits.

L'encodage n'est pas une randomisation. Les entiers séquentiels restent prévisibles après la conversion Base62. Si les identifiants doivent résister aux devinettes, générez une entropie imprévisible suffisante à l'aide d'une source cryptographique aléatoire, puis codez les octets résultants sans perdre de longueur. Ne considérez pas un jeton d’apparence compacte comme une preuve que sa génération est sécurisée.

Pour comparer la taille des résultats, incluez les préfixes, les règles de remplissage et les éventuelles métadonnées de longueur. Vérifiez un aller-retour avec au moins une entrée vide, un octet nul, plusieurs octets nuls initiaux et un octet de valeur élevée. L’alphabet Base64URL est normalisé dans RFC 4648; une application Base62 doit spécifier elle-même les détails supplémentaires.