Qu'est-ce que Base64 ?
Base64 est un codage qui représente des données binaires sous forme de texte ASCII imprimable, à partir d'un alphabet de 64 caractères : A-Z (26), a-z (26), 0-9 (10), + et /. Chaque triplet de 3 octets binaires (24 bits) est divisé en 4 groupes de 6 bits, encodés chacun par un caractère.
Conséquence : Base64 augmente la taille de ~33 % (4 caractères pour 3 octets). À ne pas utiliser pour transférer des fichiers binaires volumineux quand le binaire direct est possible.
Cas d'usage
- Pièces jointes e-mail (MIME) : SMTP ne transmet que du texte 7-bit historiquement.
- data: URLs : intégrer une image directement dans du HTML ou CSS sans requête HTTP séparée (favicons, petites icônes).
- JSON Web Tokens (JWT) : header et payload encodés en Base64-URL.
- Authentification HTTP Basic :
Authorization: Basic dXNlcjpwYXNz(user:pass en Base64). - API REST : payloads binaires (PDF, images) dans des JSON.
- Cookies / localStorage : stocker des données binaires dans un format texte.
Variante URL-safe
Les caractères + et / de l'alphabet Base64 standard posent problème dans les URL (où + signifie espace et / est un séparateur). La RFC 4648 §5 définit donc une variante Base64-URL :
+→-/→_- Le padding
=est souvent omis (compatible JWT)
Exemple complet
Texte : "Hello, monde !"
UTF-8 : 48 65 6C 6C 6F 2C 20 6D 6F 6E 64 65 20 21
Base64 : SGVsbG8sIG1vbmRlICE=Conversion dans les principaux langages
// JavaScript (UTF-8 safe)
btoa(unescape(encodeURIComponent(text))) // encode
decodeURIComponent(escape(atob(b64))) // decode
// Python
import base64
base64.b64encode(text.encode()).decode() // encode
base64.b64decode(b64).decode() // decode
base64.urlsafe_b64encode(...) // URL-safe
// PHP
base64_encode($text);
base64_decode($b64);
// Bash
echo -n "Hello" | base64
echo -n "SGVsbG8=" | base64 --decodeSécurité : pourquoi Base64 n'est pas un chiffrement
Base64 n'est PAS un chiffrement. C'est un encodage déterministe et réversible sans clé. N'importe qui peut décoder. Voir des mots de passe ou tokens « cachés » en Base64 dans des cookies ou en URL est un anti-pattern de sécurité fréquent. Pour le secret, utilisez du chiffrement symétrique (AES-256-GCM) ou asymétrique (RSA, Ed25519).
Pièges courants
- Confondre Base64 et Base64-URL → erreur de décodage du JWT.
- Encoder du texte non-UTF-8 sans précaution → caractères perdus.
- Oublier le padding
=ou en ajouter de trop. - Croire que Base64 protège des données (faux, c'est public).
- Encoder des fichiers de plusieurs Mo en Base64 dans un JSON (inefficace).
Questions fréquentes
Base64 chiffre-t-il ?
Non, encodage réversible sans clé. Lisible par tous.
URL-safe ?
Variante avec − et _ au lieu de + et /. Sans = de padding souvent.
Pourquoi le = ?
Padding pour aligner sur 3 octets. 1 ou 2 = en fin.
Taille augmente ?
+33 % (4 chars pour 3 octets).
Usage principal ?
E-mails, JWT, data: URLs, Basic Auth, JSON binaire.
Outils complémentaires
Sources
- RFC 4648 — The Base16, Base32, and Base64 Data Encodings (datatracker.ietf.org)
- MDN — btoa() et atob() (developer.mozilla.org)