base64 encoding codec web

L'encodage Base64 démystifié : Le guide ultime pour les développeurs

Maîtrisez l'encodage et le décodage Base64. Apprenez son fonctionnement, ses cas d'utilisation en développement web et ses implications sécuritaires.

Qu'est-ce que Base64 ?

Base64 est un schéma d'encodage qui représente des données binaires sous forme de séquence de caractères ASCII imprimables. Il prend n'importe quelle séquence d'octets — qu'il s'agisse d'une image, d'un PDF ou de données binaires brutes — et les encode en une chaîne composée uniquement de 64 caractères sûrs : A–Z, a–z, 0–9, + et / (avec = pour le rembourrage).

Le nom « Base64 » vient du fait que l'encodage utilise un système numérique en base 64.

Les 64 caractères

Groupe Caractères
Majuscules A–Z (26)
Minuscules a–z (26)
Chiffres 0–9 (10)
Symboles +, / (2)
Rembourrage =

Il existe également des variantes sûres pour les URL qui remplacent + par - et / par _, évitant ainsi les conflits avec les caractères spéciaux des URL.


Comment fonctionne l'encodage Base64

Base64 fonctionne en convertissant chaque groupe de 3 octets de données binaires en 4 caractères Base64.

  1. Prendre 3 octets (24 bits) de l'entrée
  2. Diviser en quatre groupes de 6 bits
  3. Mapper chaque valeur de 6 bits à un caractère de l'alphabet Base64

Exemple : Encodage de la chaîne « Man »

Caractère M a n
ASCII 77 97 110
Binaire 01001101 01100001 01101110

Combiné : 010011010110000101101110

Divisé en groupes de 6 bits : 010011 | 010110 | 000101 | 101110

Mappé : T | W | F | u → « TWFu »

Si l'entrée n'est pas un multiple de 3 octets, un rembourrage avec des caractères = est utilisé pour compléter le dernier groupe.

Surcharge de taille

L'encodage Base64 augmente la taille des données d'environ 33% (chaque groupe de 3 octets devient 4 caractères). Tenez-en compte lorsque vous envisagez d'utiliser Base64 pour de grandes quantités de données.


Bref historique

Base64 a été développé dans le contexte de MIME (Multipurpose Internet Mail Extensions), standardisé en 1992 par la RFC 1341. Les systèmes d'e-mail étaient à l'origine conçus pour ne transmettre que du texte ASCII 7 bits, mais les pièces jointes comme les images et les documents sont des données binaires. Base64 a résolu ce problème en encodant les données binaires en texte brut pouvant transiter en toute sécurité par l'infrastructure d'e-mail.

Le nom et le concept sont apparus encore plus tôt dans uuencode Unix (un schéma différent mais apparenté), mais le Base64 de MIME est devenu le standard durable.


Cas d'utilisation courants

1. Intégrer des images dans HTML/CSS

Plutôt que de référencer un fichier image externe, vous pouvez intégrer une image directement à l'aide d'une URI de données encodée en Base64 :

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />

Quand l'utiliser : Petites icônes ou images qui économisent des requêtes HTTP dans le chemin de rendu critique.

Quand l'éviter : Les grandes images — la surcharge de 33% plus l'impossibilité de mettre l'image en cache séparément l'emportent sur les avantages.

2. Authentification HTTP de base

L'authentification HTTP Basic envoie les informations d'identification sous forme de chaîne encodée en Base64 dans l'en-tête Authorization :

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

C'est username:password encodé en Base64. Important : Ce n'est PAS du chiffrement — c'est trivialement décodable. Utilisez toujours HTTPS avec l'authentification de base.

3. JWT (JSON Web Tokens)

Les tokens JWT sont composés de trois sections encodées en Base64URL séparées par des points : en-tête, charge utile et signature. L'en-tête et la charge utile sont lisibles (non chiffrés) — Base64 est ici purement pour l'encodage de transport.

4. Pièces jointes e-mail (MIME)

Comme cas d'utilisation d'origine de Base64 : les clients e-mail encodent les pièces jointes binaires (images, PDFs, etc.) en Base64 pour les transmettre en toute sécurité via l'infrastructure e-mail.

5. Stocker des données binaires dans JSON ou XML

Comme JSON et XML ne supportent que le texte, les données binaires (comme les clés de chiffrement ou les petites images) sont souvent encodées en Base64 avant d'être incluses.

6. URLs de données dans CSS

Les images de fond peuvent être intégrées directement dans CSS :

background-image: url('data:image/svg+xml;base64,PHN2ZyB4...');

Variantes de Base64

Variante Caractères Cas d'utilisation
Base64 standard A–Z a–z 0–9 + / Usage général
Base64 sûr pour URL A–Z a–z 0–9 - _ URLs, noms de fichiers, JWTs
Base64 sans rembourrage Omet = Certaines APIs préfèrent ceci
MIME Base64 Standard + sauts de ligne toutes les 76 chars E-mail

Considérations de sécurité

Base64 N'est PAS du chiffrement

C'est le point le plus critique : Base64 est un encodage, pas un chiffrement. Toute personne possédant la chaîne Base64 peut la décoder instantanément — aucune clé n'est requise. N'utilisez jamais Base64 pour « cacher » des informations sensibles.

echo "dXNlcm5hbWU6cGFzc3dvcmQ=" | base64 --decode
# Sortie : username:password

Ne pas encoder les mots de passe en Base64

Stocker les mots de passe en Base64 n'offre aucune sécurité. Utilisez plutôt des algorithmes de hachage de mots de passe appropriés comme bcrypt, Argon2 ou scrypt.

Risques XSS avec les URIs de données

Bien que les URIs de données Base64 soient elles-mêmes sûres, du JavaScript malveillant peut être encodé et exécuté via des URIs data:text/html;base64,... dans certains contextes de navigateur. La plupart des navigateurs modernes restreignent cela pour la navigation par liens et les sources d'iframes, mais désinfectez toujours les URIs de données fournies par l'utilisateur.


Base64 dans les langages de programmation

JavaScript

// Encoder
const encoded = btoa("Hello, World!");  // "SGVsbG8sIFdvcmxkIQ=="

// Décoder
const decoded = atob("SGVsbG8sIFdvcmxkIQ==");  // "Hello, World!"

Remarque : btoa/atob ne fonctionnent qu'avec des chaînes Latin-1 dans les navigateurs. Pour Unicode :

// Encodage sûr pour Unicode
const encoded = btoa(unescape(encodeURIComponent("こんにちは")));

Ou utilisez Buffer dans Node.js :

Buffer.from("Hello").toString("base64");
Buffer.from("SGVsbG8=", "base64").toString("utf8");

Python

import base64

# Encoder
encoded = base64.b64encode(b"Hello, World!").decode("utf-8")
# "SGVsbG8sIFdvcmxkIQ=="

# Décoder
decoded = base64.b64decode("SGVsbG8sIFdvcmxkIQ==").decode("utf-8")
# "Hello, World!"

# Variante sûre pour URL
url_safe = base64.urlsafe_b64encode(b"Hello+World/")

Considérations de performance

  • L'encodage/décodage est rapide : Pour la plupart des cas d'utilisation, la surcharge de Base64 est négligeable.
  • Surcharge de taille : ~33% plus grand que le binaire. À éviter pour les grands fichiers (Mo+) transmis fréquemment.
  • Pression sur le cache CPU : L'encodage de grands fichiers binaires en mémoire peut exercer une pression sur le cache CPU.

Pour les grands transferts binaires, préférez les protocoles binaires (HTTP/2 avec tramage binaire, trames binaires WebSocket, gRPC avec protobuf) à Base64.


Résumé

Base64 est l'une de ces technologies fondamentales qui sous-tendent une grande partie du web moderne sans que la plupart des développeurs y pensent. Il résout bien un problème spécifique : encoder en toute sécurité des données binaires en texte imprimable pour la transmission dans des systèmes basés sur le texte.

Utilisez Base64 quand : Vous devez intégrer des données binaires dans des contextes textuels (HTML, JSON, e-mail, en-têtes).

N'utilisez pas Base64 quand : Vous souhaitez chiffrer ou sécuriser des données — Base64 est entièrement réversible sans aucune clé.