Encodage Base64 expliqué : fonctionnement, Data URIs et JWT
Découvrez comment fonctionne l'encodage Base64, pourquoi il existe et où il est utilisé. Couvre l'algorithme d'encodage, les Data URIs, les jetons JWT, les pièces jointes d'e-mail et des exemples dans 7 langages.
Encodage Base64 expliqué : fonctionnement, Data URIs et JWT
L'encodage Base64 est l'un des schémas d'encodage les plus utilisés en informatique, mais beaucoup de développeurs l'emploient sans bien comprendre son fonctionnement ni sa raison d'être. Chaque fois que vous intégrez une image dans un e-mail HTML, décodez un jeton JWT, manipulez l'authentification HTTP Basic ou ouvrez un fichier de certificat PEM, vous travaillez avec Base64.
Ce guide explique l'algorithme Base64 depuis les bases, explore ses usages les plus courants et montre comment encoder et décoder du Base64 dans sept langages de programmation. Essayez notre encodeur et décodeur Base64 gratuit pour expérimenter avec les exemples ci-dessous.
Qu'est-ce que Base64 ?
Base64 est un schéma d'encodage binaire-vers-texte qui représente des données binaires avec 64 caractères ASCII imprimables. Il a été conçu pour transmettre des données binaires en toute sécurité sur des canaux qui ne prennent en charge que le texte, comme l'e-mail (SMTP) et les premières versions de HTTP.
Le nom "Base64" vient du fait qu'il utilise un alphabet de 64 caractères :
| Plage d'indices | Caractères | Nombre |
|---|---|---|
| 0-25 | A-Z | 26 |
| 26-51 | a-z | 26 |
| 52-61 | 0-9 | 10 |
| 62 | + | 1 |
| 63 | / | 1 |
| Remplissage | = | — |
Cela donne exactement 64 caractères (2^6), ce qui signifie que chaque caractère Base64 encode exactement 6 bits de données.
Comment fonctionne l'encodage Base64
L'algorithme Base64 convertit les données binaires en trois étapes :
Étape 1 : convertir l'entrée en binaire
Chaque octet d'entrée est représenté par 8 bits. Pour une entrée texte, cela signifie d'abord convertir chaque caractère en sa valeur d'octet ASCII ou UTF-8.
Exemple : le texte "Man" en ASCII :
| Caractère | Décimal ASCII | Binaire (8 bits) |
|---|---|---|
| M | 77 | 01001101 |
| a | 97 | 01100001 |
| n | 110 | 01101110 |
Étape 2 : découper en groupes de 6 bits
Les 24 bits combinés (3 octets × 8 bits) sont divisés en quatre groupes de 6 bits :
Original: 01001101 01100001 01101110
-------- -------- --------
Regrouped: 010011 010110 000101 101110
------ ------ ------ ------
Étape 3 : mapper vers les caractères Base64
Chaque valeur de 6 bits (0-63) correspond à un caractère de l'alphabet Base64 :
| Valeur 6 bits | Décimal | Caractère Base64 |
|---|---|---|
| 010011 | 19 | T |
| 010110 | 22 | W |
| 000101 | 5 | F |
| 101110 | 46 | u |
Résultat : "Man" → "TWFu"
Gestion du remplissage
Comme Base64 travaille par groupes de 3 octets (24 bits = quatre groupes de 6 bits), une entrée dont la longueur n'est pas un multiple de 3 octets nécessite un remplissage :
| Longueur d'entrée | Remplissage requis | Exemple |
|---|---|---|
| 3 octets (divisible) | Aucun | "Man" → "TWFu" |
| 2 octets (reste 2) | Un = | "Ma" → "TWE=" |
| 1 octet (reste 1) | Deux == | "M" → "TQ==" |
Le caractère de remplissage = indique au décodeur combien d'octets ont réellement été encodés dans le dernier groupe.
L'augmentation de taille de 33 %
L'encodage Base64 augmente toujours la taille des données d'environ 33 %. Chaque tranche de 3 octets en entrée (24 bits) devient 4 octets en sortie (4 caractères ASCII). Le ratio exact est 4/3 = 1,333...
| Taille d'origine | Taille Base64 | Surcoût |
|---|---|---|
| 1 KB | 1.33 KB | +0.33 KB |
| 10 KB | 13.3 KB | +3.3 KB |
| 100 KB | 133 KB | +33 KB |
| 1 MB | 1.33 MB | +0.33 MB |
Ce surcoût est le compromis fondamental de Base64 : une taille plus grande en échange d'une représentation textuelle sûre. Pour cette raison, Base64 convient surtout aux petits payloads, pas à l'encodage de gros fichiers sauf nécessité.
Où Base64 est utilisé
1. Data URIs (intégrer des fichiers dans HTML/CSS)
Les Data URIs permettent d'intégrer le contenu d'un fichier directement dans HTML ou CSS, en supprimant une requête HTTP :
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA..." alt="Small icon" />
Le format est : data:[MIME type];base64,[encoded data]
Quand utiliser les Data URIs :
- Petites images sous 5-10 KB (icônes, éléments décoratifs)
- Images d'arrière-plan CSS utilisées sur chaque page
- Images à usage unique qui ne bénéficient pas de la mise en cache
Quand NE PAS utiliser les Data URIs :
- Images de plus de 10 KB (le surcoût de 33 % s'accumule)
- Images partagées entre plusieurs pages (impossibles à mettre en cache séparément)
- Pages critiques pour la performance (les chaînes base64 augmentent le temps de parsing HTML)
2. JWT (JSON Web Tokens)
Les jetons JWT utilisent une variante compatible URL de Base64 (appelée Base64URL) pour leurs trois parties :
header.payload.signature
Chaque partie est encodée en Base64URL. Par exemple, le décodage d'un payload JWT :
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
se décode en :
{"sub":"1234567890","name":"John Doe","iat":1516239022}
Important : les jetons JWT sont encodés, pas chiffrés. N'importe qui peut décoder et lire le payload. Ne stockez jamais de données sensibles (mots de passe, numéros de carte bancaire) dans les payloads JWT.
3. Pièces jointes d'e-mail (MIME)
L'e-mail a été conçu à l'origine pour du texte ASCII brut. Le standard MIME (Multipurpose Internet Mail Extensions) utilise Base64 pour encoder les pièces jointes binaires :
Content-Type: application/pdf
Content-Transfer-Encoding: base64
JVBERi0xLjQKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwov...
Chaque pièce jointe d'e-mail que vous avez envoyée ou reçue a été encodée en Base64 pendant le transport.
4. Authentification HTTP Basic
HTTP Basic Auth encode les identifiants sous la forme username:password en Base64 :
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Décoder dXNlcm5hbWU6cGFzc3dvcmQ= révèle username:password. Ce n'est pas sécurisé en soi : cela doit être utilisé uniquement sur HTTPS.
5. Clés et certificats cryptographiques
Le format PEM (Privacy Enhanced Mail) enveloppe des données binaires encodées en Base64 entre des lignes d'en-tête et de pied :
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----
Les certificats SSL/TLS, les clés SSH et les clés GPG utilisent tous ce format.
Base64 standard ou Base64 compatible URL
Base64 standard utilise + et /, qui ont une signification spéciale dans les URL. Base64 compatible URL (Base64URL, défini dans RFC 4648) les remplace :
| Fonction | Base64 standard | Base64 compatible URL |
|---|---|---|
| Caractère 62 | + | - |
| Caractère 63 | / | _ |
| Remplissage | = (obligatoire) | Souvent omis |
| Utilisé dans | E-mail, PEM, Data URIs | URL, JWT, noms de fichiers |
Base64 ou autres encodages
| Encodage | Base | Augmentation de taille | Jeu de caractères | Usage courant |
|---|---|---|---|---|
| Base64 | 64 | ~33% | A-Z, a-z, 0-9, +, / | E-mail, Data URIs, JWT |
| Base32 | 32 | ~60% | A-Z, 2-7 | Codes TOTP, adresses onion |
| Base16 (Hex) | 16 | 100% | 0-9, A-F | Empreintes de hachage, codes couleur |
| Base85 (Ascii85) | 85 | ~25% | ASCII 33-117 | PDF, patches binaires Git |
Base64 offre le meilleur équilibre entre compacité et compatibilité dans la plupart des cas.
Base64 dans les langages de programmation
JavaScript
// Encode (ASCII only)
const encoded = btoa('Hello World'); // "SGVsbG8gV29ybGQ="
// Decode
const decoded = atob('SGVsbG8gV29ybGQ='); // "Hello World"
// Unicode-safe encode
const unicodeEncode = btoa(unescape(encodeURIComponent('Hello 世界')));
// Unicode-safe decode
const unicodeDecode = decodeURIComponent(escape(atob(encoded)));
Python
import base64
# Encode
encoded = base64.b64encode(b'Hello World').decode('utf-8') # "SGVsbG8gV29ybGQ="
# Decode
decoded = base64.b64decode('SGVsbG8gV29ybGQ=').decode('utf-8') # "Hello World"
# URL-safe variant
url_safe = base64.urlsafe_b64encode(b'Hello World').decode('utf-8')
Ligne de commande (macOS/Linux)
# Encode
echo -n 'Hello World' | base64 # SGVsbG8gV29ybGQ=
# Decode
echo 'SGVsbG8gV29ybGQ=' | base64 --decode # Hello World
# Encode a file
base64 image.png > image.b64
# Decode a file
base64 --decode image.b64 > image.png
Java
import java.util.Base64;
// Encode
String encoded = Base64.getEncoder().encodeToString("Hello World".getBytes());
// Decode
byte[] decoded = Base64.getDecoder().decode("SGVsbG8gV29ybGQ=");
String text = new String(decoded); // "Hello World"
PHP
// Encode
$encoded = base64_encode('Hello World'); // "SGVsbG8gV29ybGQ="
// Decode
$decoded = base64_decode('SGVsbG8gV29ybGQ='); // "Hello World"
Go
import "encoding/base64"
// Encode
encoded := base64.StdEncoding.EncodeToString([]byte("Hello World"))
// Decode
decoded, _ := base64.StdEncoding.DecodeString("SGVsbG8gV29ybGQ=")
C#
// Encode
string encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes("Hello World"));
// Decode
string decoded = Encoding.UTF8.GetString(Convert.FromBase64String("SGVsbG8gV29ybGQ="));
Base64 n'est PAS du chiffrement
Idée reçue fréquente : Base64 est souvent confondu avec le chiffrement. Ce sont des mécanismes fondamentalement différents :
| Aspect | Encodage Base64 | Chiffrement |
|---|---|---|
| Objectif | Conversion de format de données | Protection des données |
| Réversibilité | Tout le monde peut décoder | Nécessite une clé secrète |
| Sécurité | Aucune | Forte (si correctement implémenté) |
| Cas d'usage | Compatibilité de transport | Confidentialité |
N'utilisez jamais Base64 pour "cacher" des données sensibles. Il n'apporte aucune sécurité. Si vous devez protéger des données, utilisez un vrai chiffrement (AES-256, RSA), puis encodez éventuellement la sortie chiffrée en Base64 pour le transport.
Foire aux questions
Puis-je encoder une image en Base64 ?
Oui. Lisez le fichier image comme des octets binaires, puis encodez ces octets en Base64. Le résultat est une chaîne texte qui peut être intégrée dans HTML, CSS, JSON ou tout autre format textuel. Cependant, la chaîne encodée sera environ 33 % plus grande que le fichier d'origine. Pour le web, n'intégrez que de petites images (moins de 5-10 KB) sous forme de Data URIs.
Pourquoi ma chaîne Base64 se termine-t-elle par = ou == ?
Les caractères = sont du remplissage. Ils apparaissent lorsque la longueur de l'entrée n'est pas un multiple de 3 octets. Un = signifie que le dernier groupe contenait 2 octets ; == signifie qu'il contenait 1 octet. Le remplissage garantit que la longueur de la chaîne encodée est toujours un multiple de 4.
L'encodage Base64 est-il identique dans tous les langages ?
L'algorithme Base64 standard (RFC 4648) est identique dans tous les langages : la même entrée produit toujours la même sortie. Toutefois, certains langages ont par défaut un comportement différent de retour à la ligne (par exemple, getMimeEncoder() en Java ajoute des sauts de ligne tous les 76 caractères pour respecter MIME).
Prêt à encoder ou décoder du Base64 ? Essayez notre encodeur et décodeur Base64 pour une conversion instantanée avec comparaison de taille. Pour d'autres outils d'encodage, consultez notre encodeur URL, notre convertisseur hexadécimal vers texte et notre traducteur binaire.