Qu'est-ce que l'encodage Base64 et quand l'utiliser

· 9 min de lecture

Si vous travaillez avec des API, des systèmes d'e-mail ou du développement web, vous avez croisé Base64 même sans le reconnaître. Ces longues chaînes de lettres et chiffres qui ressemblent à du charabia au début d'une pièce jointe e-mail, dans une URL data: en CSS, ou au segment du milieu d'un jeton JWT ? C'est du Base64. C'est l'une des pièces de plomberie d'Internet les plus anciennes et les plus discrètement porteuses, et presque chaque logiciel que vous utilisez s'appuie dessus quelque part.

Une brève histoire de Base64

Base64 fait partie d'une famille appelée « radix-64 » ou « encodages imprimables », dont le rôle est de représenter des octets quelconques en n'utilisant que le petit alphabet de caractères qu'un système textuel est garanti de laisser passer intacts. Le membre le plus largement utilisé en premier est uuencode, écrit par Mary Ann Horton à UC Berkeley vers 1980 pour envoyer des fichiers binaires par Usenet et e-mail à une époque où ces systèmes corrompaient tout ce qui dépassait l'ASCII 7 bits.

L'alphabet Base64 lui-même a été d'abord standardisé dans la RFC 989 (1987) pour Privacy-Enhanced Mail (PEM), une première tentative d'e-mail signé et chiffré. PEM est mort, mais son schéma d'encodage a survécu et a été canonisé dans la RFC 1421 (1993) puis dans la spécification MIME (RFC 1521 et 1522 en 1993, révisées en RFC 2045 à 2049 en 1996). MIME a fait de Base64 la façon par défaut d'attacher des fichiers binaires à un e-mail, et de là l'encodage s'est diffusé à presque tout transport texte sur internet.

En 2006, l'IETF a consolidé les définitions Base64 éparses dans la RFC 4648, qui définit Base64, Base32 et Base16 dans un même document. La RFC 4648 a aussi défini la variante URL-safe en section 5, qui a remplacé les deux caractères non-URL-friendly (+ et /) par - et _. Les JSON Web Tokens (RFC 7519, 2015) ont standardisé sur Base64 URL-safe sans le padding. Aujourd'hui, chaque pièce jointe e-mail, chaque certificat encodé en PEM, chaque URL data:, chaque JWT et chaque frontière de téléversement multipart dépend de Base64.

Comment Base64 fonctionne : les maths

Base64 prend trois octets d'entrée (24 bits) et les réécrit en quatre caractères de sortie (6 bits chacun), avec un alphabet à 64 symboles. La correspondance est fixe :

Plage d'indexCaractères
0-25A-Z
26-51a-z
52-610-9
62+ (standard) ou - (URL-safe)
63/ (standard) ou _ (URL-safe)

Donc Hello devient :

La sortie est toujours un multiple de 4 caractères. Si la longueur d'entrée modulo 3 vaut 1, vous obtenez deux = de padding ; si elle vaut 2, vous obtenez un = ; si elle vaut 0, pas de padding. Le padding est parfois retiré (notamment en JWT et dans les fragments d'URL) et les décodeurs doivent tolérer cela.

L'overhead de 33 % vient de cette expansion 3-vers-4 : chaque 3 octets d'entrée deviennent 4 caractères de sortie, soit un tiers de plus. Il n'y a pas moyen de le réduire sans changer d'alphabet (Base85 / Ascii85 n'augmente que de 25 % en utilisant 85 caractères imprimables, au prix d'un encodeur plus complexe).

Cas d'usage courants

Pièces jointes e-mail. SMTP, le protocole qui transporte 95 % des e-mails entre serveurs, a été conçu en 1982 (RFC 821) pour de l'ASCII 7 bits. Toute pièce jointe binaire que vous envoyez (une image, un PDF, un ZIP) est encodée en Base64 par votre client mail avant transmission et décodée par celui du destinataire. Les en-têtes MIME dans l'e-mail indiquent au destinataire quelles parties sont en Base64 et quelles parties sont en texte brut.

URL data dans HTML et CSS. Une URL data:image/png;base64,iVBORw0KGgo... intègre un fichier binaire directement dans le document. Utile pour de petites icônes sous 1-2 Ko, où la requête HTTP économisée pèse plus lourd que l'overhead de 33 % et la perte du cache.

Charges utiles d'API. Quand une API JSON ou XML doit accepter une valeur binaire (un fichier uploadé, une signature, une photo de profil), le motif standard est d'encoder les octets en Base64 et de les transporter comme champ chaîne. Le récepteur les décode côté serveur. C'est comme ça que l'entrée image d'OpenAI fonctionne, comme Stripe reçoit les uploads de fichiers, et comme la plupart des fonctions cloud acceptent l'entrée binaire.

HTTP Basic Authentication. L'en-tête Authorization: Basic <token> porte une paire username:password encodée en Base64 (RFC 7617). C'est de l'encodage, pas du chiffrement : quiconque voit l'en-tête voit le mot de passe. Basic Auth exige HTTPS pour cette raison.

Certificats et clés. Les fichiers PEM (-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----) enveloppent un blob d'octets ASN.1 encodés en DER, encodés en Base64. Chaque certificat TLS, chaque fichier de clé SSH, chaque certificat de signature de code est du Base64 dans une enveloppe PEM.

Jetons JWT. Un JWT est composé de trois segments Base64 URL-safe séparés par des points : <header>.<payload>.<signature>. L'encodage Base64 permet à un JWT de voyager en sécurité dans les en-têtes, les URL et les cookies.

Comment encoder et décoder

  1. Choisissez encoder ou décoder : sélectionnez le sens de conversion.
  2. Collez du texte ou téléversez un fichier : entrez le texte directement ou glissez-déposez un fichier (jusqu'à 5 Mo pour l'encodage côté navigateur).
  3. Choisissez la variante : Base64 standard pour les e-mails et certificats, URL-safe pour JWT et fragments d'URL. L'outil utilise standard par défaut.
  4. Copiez le résultat : la sortie se met à jour instantanément. Copiez-la dans votre presse-papiers, ou utilisez le bouton de téléchargement pour les sorties longues.

Variantes de Base64

Plusieurs encodages de type Base64 existent pour des situations spécifiques :

VarianteDifférencesOù utilisée
Standard (RFC 4648 §4)A-Z, a-z, 0-9, +, /, = paddingE-mail (MIME), PEM, transport binaire générique
URL-safe (RFC 4648 §5)+ devient -, / devient _JWT, fragments d'URL, noms de fichiers
MIME (RFC 2045)Sauts de ligne tous les 76 caractèresCorps d'e-mail, en-têtes mail (avec =?utf-8?B?...?=)
crypt(3) / htpasswdAlphabet différent (./0-9A-Za-z)Anciens hachages Unix (basés DES)
Base64Url sans paddingURL-safe sans = finalJWT (selon RFC 7515)
Base32 (RFC 4648 §6)Alphabet 32 caractères, insensible à la casseSecrets TOTP, adresses Onion
Base58Alphabet 58 caractères (pas 0, O, I, l)Adresses Bitcoin, CID IPFS
Ascii85 / Base85Alphabet 85 caractères, overhead 25 %PDF, PostScript

La plupart du temps vous voulez Base64 standard ou URL-safe. Les autres apparaissent dans des protocoles spécifiques.

Quand utiliser Base64

Utilisez-le quand :

Ne l'utilisez pas quand :

Pièges courants

Alternatives et encodages voisins

Base64 est le défaut, pas la seule option. Le bon choix dépend du canal et du budget de taille.

EncodageOverheadForceMeilleur pour
Hex (Base16)100 %Trivial à lire, chaque octet est deux caractèresSortie de debug, identifiants courts, codes couleur
Base32 (RFC 4648)60 %Insensible à la casse, pas de caractères ambigusSecrets TOTP, adresses Onion, dictée vocale
Base64 standard33 %Universel, chaque langage l'aE-mail, PEM, transport générique
Base64 URL-safe33 %Sûr pour URL et noms de fichiersJWT, fragments d'URL
Base58~37 %Pas de confusion 0/O/I/l, pas de caractères spéciauxAdresses Bitcoin, CID IPFS
Ascii85 / Base8525 %Plus dense que Base64PDF, PostScript
Base91~22 %Encore plus dense, plus complexeRare, contextes de compression de niche
Upload multipart0 %Transport binaire natif via HTTPUploads de fichiers (les navigateurs le font pour vous)
gzip + Base64variableParfois plus petit que Base64 brutCharges utiles pré-compressées

Pour la plupart des cas du quotidien, la réponse est Base64 (standard ou URL-safe). Pour les uploads binaires sur HTTP, la bonne réponse est généralement multipart/form-data, qui n'encode pas du tout.

Confidentialité et l'encodeur

L'encodeur et décodeur Base64 tourne entièrement dans votre navigateur. Le texte ou fichier que vous saisissez est traité par JavaScript sur votre appareil, le résultat est rendu sur la page, et rien n'est envoyé à un serveur. Rien n'est journalisé, rien n'est stocké après que vous quittez la page, et aucun tag d'analytics ne voit le contenu. Pour les choses que vous pourriez encoder en Base64 (certificats PEM, clés privées, charges utiles JWT de systèmes de production, brouillons de requêtes API avec de vraies données client), ce flux strictement local est le bon défaut. L'outil entier peut tourner hors-ligne une fois la page chargée, ce que vous pouvez vérifier en coupant le réseau et en ré-encodant la même entrée.

Questions fréquentes

Le Base64 chiffre-t-il mes données ?

Non. Le Base64 est un encodage, pas un chiffrement. N'importe qui peut décoder une chaîne Base64, cela n'apporte aucune sécurité. Si vous voulez protéger des données, utilisez un vrai chiffrement (AES, RSA, etc.).

Pourquoi le Base64 rend-il les fichiers plus lourds ?

L'encodage Base64 augmente la taille des données d'environ 33 %. Trois octets binaires deviennent quatre caractères Base64. Ce surcoût est le prix à payer pour pouvoir transmettre du binaire en toute sécurité sous forme de texte.

Puis-je encoder des fichiers, pas seulement du texte ?

Oui. Tout fichier (images, PDF, audio) peut être encodé en Base64. C'est couramment utilisé pour intégrer de petites images directement dans du HTML ou du CSS sous forme de Data URL.

Quand NE PAS utiliser le Base64 ?

Ne l'utilisez pas pour de gros fichiers. Une image de 1 Mo devient 1,33 Mo en texte Base64, et le navigateur ne peut pas la mettre en cache séparément. Pour tout ce qui dépasse quelques Ko, servir le fichier normalement est plus efficace.

What is the difference between standard Base64 and URL-safe Base64?

Standard Base64 (RFC 4648 section 4) uses the characters A-Z, a-z, 0-9, +, / with = padding. URL-safe Base64 (RFC 4648 section 5) swaps + for - and / for _ so the string is safe to drop into a URL or a filename without percent-encoding. JWT tokens use the URL-safe variant.

Why does Base64 sometimes have one or two = signs at the end?

The = is padding. Base64 encodes input in 3-byte groups; if the input length is not a multiple of 3, the last group is padded with zero bits and one or two = characters mark the missing bytes. One = means one missing byte, two = means two missing bytes.