Qu'est-ce que le codage Base64 ?
Base64 est un schéma de codage binaire-vers-texte qui représente des données binaires dans un format de chaîne ASCII. Il est couramment utilisé lorsqu'il est nécessaire d'encoder des données binaires, en particulier pour transférer des données sur des supports conçus pour gérer des données textuelles. Si vous avez déjà vu une chaîne de caractères comme aGVsbG8gd29ybGQ= et vous êtes demandé ce qu'elle représente, vous avez rencontré le codage Base64. Ce guide explique ce qu'est Base64, comment il fonctionne en interne, pourquoi il existe et quand l'utiliser.
La raison fondamentale de l'existence de Base64 est que de nombreux protocoles de transport et formats de données ont été conçus pour le texte, pas pour les données binaires. Le courrier électronique était conçu à l'origine pour transporter uniquement du texte ASCII 7 bits. JSON et XML sont des formats basés sur le texte. Les URL ont des jeux de caractères restreints. Lorsque vous devez envoyer un fichier image, une clé cryptographique ou toute autre donnée binaire via ces canaux, vous avez besoin d'un moyen de représenter les octets binaires sous forme de caractères textuels sûrs. Base64 résout ce problème en mappant des octets arbitraires sur un ensemble de 64 caractères sûrs.
Le problème que résout Base64
Imaginez que vous souhaitiez envoyer une photo à un ami par email. La photo est stockée sous forme de fichier binaire. Lorsque vous la joignez à un email, le client et le serveur de messagerie doivent encoder les données binaires pour qu'elles traversent en toute sécurité l'infrastructure email, conçue pour les messages textuels. Les premiers systèmes de messagerie pouvaient corrompre les données binaires car ils interprétaient certaines valeurs d'octets comme des caractères de contrôle ou supprimaient le bit de poids fort de chaque octet.
Base64 résout ce problème en représentant les données binaires en utilisant uniquement des caractères universellement pris en charge dans les systèmes textuels : lettres majuscules, lettres minuscules, chiffres et deux caractères supplémentaires (+ et /), plus le caractère de complément (=). Cela garantit que les données encodées survivent à la transmission à travers tout système gérant du texte ASCII.
Comment fonctionne Base64
Base64 convertit des groupes de 3 octets (24 bits) en 4 groupes de 6 bits chacun. Chaque groupe de 6 bits est mappé à un caractère de l'alphabet Base64. Le processus est déterministe et entièrement réversible, ce qui signifie que toute chaîne encodée en Base64 peut être décodée pour retrouver les données binaires d'origine.
Le processus étape par étape
Suivons le processus d'encodage du texte « Man » pour comprendre le mécanisme.
-
Prenez les valeurs ASCII de chaque caractère :
- M = 77 (décimal) = 01001101 (binaire)
- a = 97 (décimal) = 01100001 (binaire)
- n = 110 (décimal) = 01101110 (binaire)
-
Concaténez les valeurs de 8 bits en une seule séquence de 24 bits :
- 01001101 01100001 01101110
-
Divisez la séquence de 24 bits en quatre groupes de 6 bits :
- 010011 = 19
- 010110 = 22
- 000101 = 5
- 101110 = 46
-
Mappez chaque valeur de 6 bits au caractère correspondant de l'alphabet Base64 à l'aide de la table d'index :
- 19 → T
- 22 → W
- 5 → F
- 46 → u
-
Résultat : « TWFu »
Gestion du complément (padding)
Que se passe-t-il lorsque la longueur d'entrée n'est pas un multiple de 3 octets ? Base64 utilise un complément (padding) pour gérer ce cas. Si le dernier groupe n'a qu'un seul octet (8 bits), il est complété par 4 bits à zéro pour former deux groupes de 6 bits, et deux caractères de complément (==) sont ajoutés. Si le dernier groupe a 2 octets (16 bits), il est complété par 2 bits à zéro pour former trois groupes de 6 bits, et un caractère de complément (=) est ajouté.
Par exemple, l'encodage du simple octet « M » (01001101) :
- Groupe de 24 bits : 01001101 00000000 00000000 (complété avec des zéros)
- Groupes de 6 bits : 010011 = 19 → T, 010000 = 16 → Q, 000000 = 0 → A, 000000 = 0 → A
- Mais comme un seul octet a été fourni, nous ajoutons le complément
== - Résultat : « TQ== »
Le complément garantit que la longueur de la sortie encodée est toujours un multiple de 4 caractères. Les décodeurs utilisent le complément pour déterminer combien d'octets ignorer lors de la conversion en données binaires.
L'alphabet Base64 complet
| Valeur | Car | Valeur | Car | Valeur | Car | Valeur | Car |
|---|---|---|---|---|---|---|---|
| 0 | A | 16 | Q | 32 | g | 48 | w |
| 1 | B | 17 | R | 33 | h | 49 | x |
| 2 | C | 18 | S | 34 | i | 50 | y |
| 3 | D | 19 | T | 35 | j | 51 | z |
| 4 | E | 20 | U | 36 | k | 52 | 0 |
| 5 | F | 21 | V | 37 | l | 53 | 1 |
| 6 | G | 22 | W | 38 | m | 54 | 2 |
| 7 | H | 23 | X | 39 | n | 55 | 3 |
| 8 | I | 24 | Y | 40 | o | 56 | 4 |
| 9 | J | 25 | Z | 41 | p | 57 | 5 |
| 10 | K | 26 | a | 42 | q | 58 | 6 |
| 11 | L | 27 | b | 43 | r | 59 | 7 |
| 12 | M | 28 | c | 44 | s | 60 | 8 |
| 13 | N | 29 | d | 45 | t | 61 | 9 |
| 14 | O | 30 | e | 46 | u | 62 | + |
| 15 | P | 31 | f | 47 | v | 63 | / |
Le caractère de complément = est utilisé lorsque la longueur des données d'entrée n'est pas un multiple de 3 octets.
Cas d'utilisation courants
Le codage Base64 apparaît dans de nombreux contextes différents du développement web et de l'ingénierie logicielle.
| Cas d'utilisation | Description |
|---|---|
| Data URIs | Intégration d'images dans du HTML ou CSS |
| Authentification HTTP Basic | Encodage des identifiants dans les en-têtes |
| Payloads JSON/XML | Stockage de données binaires dans des formats texte |
| Pièces jointes email | Encodage MIME Base64 |
| Tokens JWT | Encodage de l'en-tête et du payload |
Data URIs
Les Data URIs permettent d'intégrer des images, des polices et d'autres ressources directement dans des fichiers HTML ou CSS. Au lieu de créer un lien vers un fichier image externe, vous encodez l'image en Base64 et l'incluez en ligne :
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...">
Cela élimine une requête HTTP au prix d'une augmentation de taille de 33 %. Les Data URIs sont particulièrement utiles pour les petits éléments comme les icônes, les logos et les composants d'interface.
Authentification HTTP Basic
L'authentification HTTP Basic envoie les identifiants sous forme de chaîne encodée en Base64 dans l'en-tête Authorization. Le format est Basic base64(utilisateur:motdepasse). Notez que Base64 n'est pas du chiffrement ; les identifiants sont trivialement décodés par quiconque intercepte la requête. L'authentification Basic doit toujours être utilisée via HTTPS pour protéger les identifiants en transit.
Authorization: Basic am9objpzZWNyZXQ=
Le décodage de am9objpzZWNyZXQ= révèle « john:secret ».
Payloads JSON et XML
Lorsque vous devez inclure des données binaires (comme un fichier téléchargé, une clé cryptographique ou une vignette d'image) dans un payload JSON ou XML, Base64 est l'approche standard. Les données binaires sont converties en une chaîne Base64 et incluses comme valeur de propriété :
{
"filename": "photo.jpg",
"data": "/9j/4AAQSkZJRgABAQAAAQABAAD//gA..."
}
Pièces jointes email (MIME)
La norme MIME (Multipurpose Internet Mail Extensions) utilise Base64 pour encoder les pièces jointes des emails. Lorsque vous envoyez un email avec une image jointe, votre client de messagerie convertit l'image en Base64, l'encapsule dans les en-têtes MIME appropriés et l'inclut dans le corps du message. Le client de messagerie destinataire décode le Base64 pour retrouver le fichier image d'origine.
Tokens JWT
Les JSON Web Tokens (JWT) utilisent une variante de Base64 compatible avec les URL, appelée Base64URL, pour encoder l'en-tête et le payload. Base64URL remplace + par - et / par _, et supprime le complément =. Le résultat est un token compact et compatible avec les URL qui transporte des informations d'authentification et d'autorisation.
Encodage et décodage en code
La plupart des langages de programmation fournissent des fonctions intégrées pour l'encodage et le décodage Base64.
JavaScript (Navigateur)
// Encoding
const encoded = btoa('Hello, World!');
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ=="
// Decoding
const decoded = atob(encoded);
console.log(decoded); // "Hello, World!"
Node.js
const encoded = Buffer.from('Hello, World!').toString('base64');
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ=="
const decoded = Buffer.from(encoded, 'base64').toString('utf-8');
console.log(decoded); // "Hello, World!"
Python
import base64
encoded = base64.b64encode(b'Hello, World!')
print(encoded) # b'SGVsbG8sIFdvcmxkIQ=='
decoded = base64.b64decode(encoded)
print(decoded) # b'Hello, World!'
PHP
$encoded = base64_encode('Hello, World!');
echo $encoded; // "SGVsbG8sIFdvcmxkIQ=="
$decoded = base64_decode($encoded);
echo $decoded; // "Hello, World!"
Surcharge de taille
Le codage Base64 augmente la taille des données d'environ 33 %. Pour 3 octets d'entrée, Base64 produit 4 octets de sortie. Cette surcharge est le prix à payer pour rendre les données binaires sûres pour les systèmes textuels.
En pratique, un fichier binaire de 1 Mo devient environ 1,37 Mo après encodage Base64. Avant d'encoder de grandes quantités de données en Base64, déterminez si la surcharge d'encodage est acceptable pour votre cas d'utilisation. Pour de petites quantités de données (icônes, tokens, messages courts), la surcharge est négligeable. Pour les fichiers volumineux (photos, vidéos, archives), la surcharge peut être significative et des approches alternatives doivent être envisagées.
Variantes de Base64
L'alphabet Base64 standard décrit ci-dessus n'est pas la seule variante. Différentes applications utilisent des alphabets légèrement différents pour répondre à leurs contraintes spécifiques.
Base64URL remplace + par - et / par _, et omet le complément. Cette variante est sûre pour une utilisation dans les URL et les noms de fichiers sans encodage supplémentaire. Elle est utilisée par les JWT, les tokens OAuth et les API de cryptographie web.
MIME Base64 est la variante utilisée dans les emails et inclut des sauts de ligne tous les 76 caractères pour respecter les restrictions de longueur de ligne des emails.
PEM (Privacy-Enhanced Mail) utilise le codage Base64 avec des lignes d'en-tête et de pied (-----BEGIN CERTIFICATE-----) pour encoder les certificats X.509, les clés privées et autres objets cryptographiques.
Pourquoi ce n'est pas du chiffrement ?
Base64 n'est pas du chiffrement. C'est un schéma de codage, ce qui signifie qu'il peut être facilement décodé sans aucune clé. L'algorithme est publiquement spécifié, l'alphabet est fixe et tout développeur peut décoder une chaîne Base64 en quelques minutes à l'aide de fonctions intégrées.
N'utilisez jamais Base64 pour protéger des données sensibles. Base64 n'offre aucune confidentialité, aucune intégrité et aucune authentification. Si vous devez protéger des données contre tout accès non autorisé, utilisez des algorithmes de chiffrement appropriés comme AES (symétrique) ou RSA (asymétrique). Si vous devez vérifier que des données n'ont pas été altérées, utilisez une fonction de hachage cryptographique comme SHA256 combinée à une signature numérique ou HMAC.
Une erreur courante chez les débutants est de penser que Base64 est une forme de chiffrement parce que la sortie ressemble à des caractères aléatoires. En réalité, Base64 est trivialement réversible et n'offre aucune sécurité. Utilisez toujours des algorithmes cryptographiques établis à des fins de sécurité et réservez Base64 à son objectif prévu : encoder en toute sécurité des données binaires pour un transport textuel.