Encoder, c'est convertir des données d'une représentation à une autre pour qu'elles puissent circuler ou être stockées là où un format précis est attendu. Ce n'est pas du chiffrement : il n'y a pas de clé, n'importe qui peut l'inverser et rien n'est caché. Base64 en est l'exemple le plus courant : il écrit n'importe quels octets avec seulement 64 caractères imprimables sûrs, ce qui permet à des données binaires de traverser des systèmes conçus pour du texte.
Pourquoi Base64 existe
De nombreux protocoles anciens ont été conçus pour du texte brut. Les corps d'e-mail, les chaînes JSON, les URL et les attributs HTML peuvent casser ou corrompre des octets quelconques : un octet nul isolé, un saut de ligne mal placé ou un caractère qui a un sens spécial. Base64 évite le problème en n'utilisant que A-Z, a-z, 0-9, + et / (plus = pour le remplissage). Vous le croiserez dans les pièces jointes d'e-mail, les URL data:, les JSON Web Tokens et les clés des fichiers de certificats.
Comment ça marche
Base64 lit l'entrée trois octets (24 bits) à la fois et redécoupe ces 24 bits en quatre groupes de 6 bits. Chaque groupe de 6 bits est un nombre de 0 à 63, et chaque nombre choisit un caractère de l'alphabet (A vaut 0, Z vaut 25, a vaut 26, z vaut 51, 0 vaut 52, 9 vaut 61, + vaut 62, / vaut 63).
Prenons les trois lettres Man :
| Caractère | M | a | n |
|---|---|---|---|
| Valeur de l'octet | 77 | 97 | 110 |
| 8 bits | 01001101 |
01100001 |
01101110 |
Mises bout à bout, cela donne 010011010110000101101110, qui se découpe en quatre groupes de 6 bits :
| Groupe de 6 bits | Indice | Caractère |
|---|---|---|
010011 |
19 | T |
010110 |
22 | W |
000101 |
5 | F |
101110 |
46 | u |
Man devient donc TWFu. Vous pouvez le vérifier avec Encodeur Base64.
Remplissage et taille
Trois octets en entrée donnent toujours quatre caractères : la sortie est donc environ un tiers plus grande que l'entrée. Quand la longueur de l'entrée n'est pas un multiple de trois, le dernier groupe est complété par des signes = pour que la sortie reste un multiple de quatre.
| Entrée | Base64 | Octets d'entrée | Caractères de sortie |
|---|---|---|---|
Hi |
SGk= |
2 | 4 |
Hello |
SGVsbG8= |
5 | 8 |
Hello, world! |
SGVsbG8sIHdvcmxkIQ== |
13 | 20 |
a |
YQ== |
1 | 4 |
ab |
YWI= |
2 | 4 |
abc |
YWJj |
3 | 4 |
Un octet restant donne deux caractères et == ; deux octets restants donnent trois caractères et =.
Variantes
- Base64 sûr pour les URL remplace
+par-et/par_(et supprime souvent le=), car+,/et=ont un sens particulier dans les URL. Les octetsfb ff fedonnent+//+en Base64 standard et-__-en version sûre pour les URL. Les JSON Web Tokens utilisent cette variante. - Base64 MIME (e-mail) insère un saut de ligne tous les 76 caractères.
- Base32 et Base16 (hexadécimal) fonctionnent de la même façon avec des alphabets plus petits : ils sont plus longs, mais plus pratiques pour les systèmes insensibles à la casse et pour saisir des codes à la main.
Erreurs courantes
- Prendre Base64 pour de la sécurité. Un mot de passe ou un secret simplement en Base64 est à la vue de tous. N'importe qui peut le coller dans Décodeur Base64. Utilisez un vrai chiffrement ou un hachage pour les secrets.
- Encoder du texte sans choisir de jeu de caractères. Base64 encode des octets, pas des lettres. Pour du texte, il importe que ces octets soient de l'UTF-8 ou autre chose, et une discordance transforme
éen charabia à l'arrivée. - Encoder deux fois. Encoder des données déjà encodées les gonfle d'un tiers supplémentaire et donne un texte illisible une fois décodé. Si les données décodées ressemblent encore à du Base64, elles ont été encodées deux fois.
- Oublier la variante. Le Base64 standard et celui sûr pour les URL ne sont pas interchangeables : une chaîne contenant
-ou_échoue dans un décodeur standard strict. - Le casser avec des sauts de ligne ou des espaces. Certains décodeurs rejettent les sauts de ligne intégrés ; d'autres les ignorent.
Où l'essayer
Encodez avec Encodeur Base64 et décodez avec Décodeur Base64 ; les deux s'exécutent entièrement dans votre navigateur. Pour les octets sous le texte, voyez ASCII et UTF-8.