À quoi sert l'encodage en base 64?

782

J'ai entendu des gens parler «d'encodage base 64» ici et là. A quoi cela sert?

MrDatabase
la source
1
Extrait du manuel de base64_encode () : "Ce codage est conçu pour faire en sorte que les données binaires survivent au transport via des couches de transport qui ne sont pas propres à 8 bits, comme les corps de messagerie."
still_dreaming_1

Réponses:

941

Lorsque vous avez des données binaires que vous souhaitez expédier sur un réseau, vous ne le faites généralement pas en diffusant simplement les bits et octets sur le câble dans un format brut. Pourquoi? car certains supports sont conçus pour diffuser du texte. Vous ne savez jamais - certains protocoles peuvent interpréter vos données binaires comme des caractères de contrôle (comme un modem), ou vos données binaires pourraient être vissées parce que le protocole sous-jacent pourrait penser que vous avez entré une combinaison de caractères spéciaux (comme la façon dont FTP traduit la ligne terminaisons).

Donc, pour contourner cela, les gens encodent les données binaires en caractères. Base64 est l'un de ces types d'encodages.

Pourquoi 64?
Parce que vous pouvez généralement compter sur les mêmes 64 caractères présents dans de nombreux jeux de caractères, et vous pouvez être raisonnablement sûr que vos données finiront de l'autre côté du fil sans être corrompues.

Dave Markle
la source
104
(En théorie, vous pourriez faire un codage en base 80 ou quelque chose de similaire, mais ce serait beaucoup plus difficile. Les puissances de deux sont des bases naturelles pour le binaire.)
Jon Skeet
13
@yokees: Il n'y a aucune garantie, ce ne sont que des personnages qui sont presque toujours en sécurité. C'est pourquoi il existe plusieurs formes de Base-64 ( en.wikipedia.org/wiki/Base-64 ).
8
Est-ce à dire que toutes les données de type réseau qui passent doivent utiliser une sorte de codage?
Tanner Summers
6
Mais pourquoi la méthode base64 est-elle utilisée pour coder les données de chaîne? par exemple dans la fonction atob javascript Y at-il une signification pour le serveur de coder un fichier json au format base64? Les caractères spéciaux pourraient être un cas d'utilisation, mais pourquoi pas utf8 dans ce cas, sont-ils équivalents? Toute autre ressource à ce sujet serait grandement appréciée, merci.
partizanos
4
Une liste d'au moins certains protocoles qui échoueraient serait bien d'avoir si quelqu'un le sait.
Tadej
202

C'est essentiellement un moyen de coder des données binaires arbitraires en texte ASCII. Il faut 4 caractères par 3 octets de données, plus éventuellement un peu de remplissage à la fin.

Essentiellement, chaque 6 bits de l'entrée est codé dans un alphabet de 64 caractères. L'alphabet "standard" utilise AZ, az, 0-9 et + et /, avec = comme caractère de remplissage. Il existe des variantes sécurisées pour les URL.

Wikipédia est une bonne source d'informations.

Jon Skeet
la source
Dans une langue comme php, d'où proviendront les données binaires. Nous travaillons presque toujours avec des données de chaîne qui sont du texte.
Cholthi Paul Ttiopic
3
@CholthiPaulTtiopic: Les résultats du chiffrement ou de la compression, ou du son / images / vidéo.
Jon Skeet
1
@CholthiPaulTtiopic: Je crains de n'avoir aucune idée de ce que vous entendez par "qu'en est-il du stockage" mais à ce stade, je pense que nous sommes quelque peu hors sujet.
Jon Skeet
2
@CholthiPaulTtiopic: J'éviterais fortement de penser en termes de "chaîne binaire". Les données binaires doivent être traitées comme des données binaires et non comme du texte. J'ai vu littéralement des centaines - peut-être des milliers - de questions sur le SO qui se résument essentiellement à des gens qui ne font pas assez attention à cette distinction.
Jon Skeet
1
@ still_dreaming_1 PHP les appelle binary strings. (source) php.net/manual/en/function.pack.php
Cholthi Paul Ttiopic
123

L'encodage Base-64 est un moyen de prendre des données binaires et de les transformer en texte afin qu'elles soient plus facilement transmises dans des choses comme les e-mails et les données de formulaire HTML.

http://en.wikipedia.org/wiki/Base64

Brad Wilson
la source
116

C'est un encodage textuel de données binaires où le texte résultant n'a que des lettres, des chiffres et les symboles "+", "/" et "=". C'est un moyen pratique de stocker / transmettre des données binaires sur un support spécifiquement utilisé pour les données textuelles.

Mais pourquoi Base-64? Les deux alternatives pour convertir des données binaires en texte qui viennent immédiatement à l'esprit sont:

  1. Décimal: stockez la valeur décimale de chaque octet sous forme de trois nombres: 045 112 101 037, etc. où chaque octet est représenté par 3 octets. Les données se multiplient par trois.
  2. Hexadécimal: stockez les octets sous forme de paires hexadécimales: AC 47 0D 1A etc. où chaque octet est représenté par 2 octets. Les données gonflent deux fois.

La base 64 mappe 3 octets (8 x 3 = 24 bits) en 4 caractères qui s'étendent sur 6 bits (6 x 4 = 24 bits). Le résultat ressemble à "TWFuIGlzIGRpc3Rpb ...". Par conséquent, le ballonnement n'est que de 4/3 = 1,3333333 fois l'original.

Ates Goral
la source
10
Est-ce que je comprends bien, que 64 est le meilleur choix car c'est la puissance la plus élevée de deux qui est convertible en un caractère ASCII imprimable (il y en a 95)?
voho
Si dans les deux cas, il s'agit de 24 bits, le ballonnement n'est-il pas 1: 1? Ou Lorsque vous dites 4 caractères qui s'étendent sur 6 bits, voulez-vous dire qu'il y a en fait 8 bits par caractère mais que les deux premiers sont des 0 remplis?
David Klempfner
1
@Backwards_Dave Chaque 6 bits sont exprimés en 8 bits. Le ballonnement est donc de 8: 6 ou 4: 3.
Ates Goral
82

Mis à part ce qui a déjà été dit, deux utilisations très courantes qui n'ont pas été répertoriées sont

Hashs:

Les hachages sont des fonctions unidirectionnelles qui transforment un bloc d'octets en un autre bloc d'octets de taille fixe tel que 128 bits ou 256 bits (SHA / MD5). La conversion des octets résultants en Base64 facilite beaucoup l'affichage du hachage, en particulier lorsque vous comparez une somme de contrôle pour l'intégrité. Les hachages sont si souvent vus dans Base64 que beaucoup de gens confondent Base64 lui-même comme un hachage.

Cryptographie:

Puisqu'une clé de chiffrement ne doit pas être du texte mais des octets bruts, il est parfois nécessaire de la stocker dans un fichier ou une base de données, ce qui est utile pour Base64. Idem avec les octets chiffrés résultants.

Notez que bien que Base64 soit souvent utilisé en cryptographie, ce n'est pas un mécanisme de sécurité. N'importe qui peut reconvertir la chaîne Base64 dans ses octets d'origine, elle ne doit donc pas être utilisée comme moyen de protéger les données, mais uniquement comme format pour afficher ou stocker plus facilement les octets bruts.

Certificats

Les certificats x509 au format PEM sont codés en base 64. http://how2ssl.com/articles/working_with_pem_files/

Despertar
la source
4
Il est en fait plus facile, en termes de traitement, de stocker des octets sous forme d'octets dans de nombreux cas. Même dans une base de données, et surtout dans un fichier (si des enregistrements de longueur fixe sont utilisés, ou si les octets sont le seul contenu). Base64 est généralement utilisé lorsque ces octets sont destinés à être transmis quelque part, en particulier sur un canal qui peut tronquer des bits ou interpréter certains des octets comme des codes de contrôle.
cHao
Je n'ai jamais vu un hachage écrit en entiers 8 bits non signés, 0,1,255,36 ... et l'afficher avec UTF-8 ou tout autre encodage n'aurait aucun sens, comment pourriez-vous l'afficher autrement qu'avec base64? Les clés de chiffrement et les données chiffrées sont souvent stockées dans des fichiers de configuration et XML où vous ne pouvez pas stocker les octets bruts. Je suis d'accord si vous pouvez le stocker sous forme d'octets bruts puis par tous les moyens, mais base64 est pour les situations où vous ne pouvez pas. Il existe de nombreuses utilisations de base64 au-delà de la transmission. Ce ne sont que deux scénarios courants où vous le verrez.
Despertar
1
Vous afficheriez le hachage sous forme hexadécimale, pas décimale. Pour les hachages, c'est en fait beaucoup plus courant que base64.
cHao
@cHao Oui, cela est également courant. Les chiffres hexadécimaux peuvent représenter n'importe quelle donnée binaire, mais la base 64 a l'avantage de prendre beaucoup moins d'espace car elle utilise plus de caractères.
Despertar
45

Il y a des années, lorsque la fonctionnalité de publipostage a été introduite, de sorte qu'elle était entièrement basée sur le texte, au fil du temps, le besoin de pièces jointes telles que l'image et les médias (audio, vidéo, etc.) est apparu. Lorsque ces pièces jointes sont envoyées sur Internet (qui se présente essentiellement sous la forme de données binaires), la probabilité de corruption des données binaires est élevée dans sa forme brute. Donc, pour résoudre ce problème, BASE64 est arrivé.

Le problème avec les données binaires est qu'elles contiennent des caractères nuls qui, dans certains langages comme C, C ++, représentent la fin de la chaîne de caractères, donc l'envoi de données binaires sous forme brute contenant des octets NULL empêchera la lecture complète d'un fichier et entraînera des données corrompues.

Par exemple :

En C et C ++, ce caractère "null" montre la fin d'une chaîne. Donc "BONJOUR" est stocké comme ceci:

BONJOUR

72 69 76 76 79 00

Le 00 dit "arrêtez-vous ici".

Voyons maintenant comment fonctionne l'encodage BASE64.

Point à noter: la longueur de la chaîne doit être multiple de 3.

Exemple 1 :

Chaîne à encoder: "ace", Longueur = 3

1) Convertissez chaque caractère en décimal.

a = 97, c = 99, e = 101

entrez la description de l'image ici

2) Modifiez chaque décimale en représentation binaire à 8 bits.

97 = 01100001, 99 = 01100011, 101 = 01100101

Combiné: 01100001 01100011 01100101

3) Séparez dans un groupe de 6 bits.

011000 010110 001101 100101

4) Calculer le binaire en décimal

011000 = 24, 010110 = 22, 001101 = 13, 100101 = 37

5) Convertissez les caractères décimaux en base64 à l'aide du graphique base64.

24 = O, 22 = W, 13 = N, 37 = l

"Ace" => "YWNl"

entrez la description de l'image ici

Exemple 2:

Chaîne à encoder: "abcd" Longueur = 4, ce n'est pas un multiple de 3. Donc, pour faire une longueur de chaîne multiple de 3, nous devons ajouter un remplissage de 2 bits pour faire une longueur = 6. Le bit de remplissage est représenté par le signe "=".

Point à noter: un bit de remplissage équivaut à deux zéros 00 donc deux bits de remplissage égal à quatre zéros 0000.

Permet donc de démarrer le processus: -

1) Convertissez chaque caractère en décimal.

a = 97, b = 98, c = 99, d = 100

2) Modifiez chaque décimale en représentation binaire à 8 bits.

97 = 01100001, 98 = 01100010, 99 = 01100011, 100 = 01100100

3) Séparez dans un groupe de 6 bits.

011000, 010110, 001001, 100011, 011001, 00

de sorte que le dernier 6 bits n'est pas complet, nous insérons donc deux bits de remplissage qui correspondent à quatre zéros «0000».

011000, 010110, 001001, 100011, 011001, 000000 ==

Maintenant, c'est égal. Deux signes égaux à la fin montrent que 4 zéros ont été ajoutés (aide au décodage).

4) Calculez le binaire en décimal.

011000 = 24, 010110 = 22, 001001 = 9, 100011 = 35, 011001 = 25, 000000 = 0 ==

5) Convertissez les caractères décimaux en base64 à l'aide du graphique base64.

24 = Y, 22 = W, 9 = j, 35 = j, 25 = Z, 0 = A ==

"Abcd" => "YWJjZA =="

Rajesh Prajapati
la source
5
c'est vraiment une excellente explication
maheshmnj
28

Dans les premiers temps des ordinateurs, lorsque la communication inter-système de ligne téléphonique n'était pas particulièrement fiable, une méthode rapide et sale de vérification de l'intégrité des données était utilisée: la "parité des bits". Dans cette méthode, chaque octet transmis aurait 7 bits de données, et le 8e serait 1 ou 0, pour forcer le nombre total de 1 bits dans l'octet à être pair.

Par conséquent, 0x01 serait transmis comme 0x81; 0x02 serait 0x82; 0x03 resterait 0x03 etc.

Pour faire avancer ce système, lorsque le jeu de caractères ASCII a été défini, seuls 00-7F ont été affectés à des caractères. (Encore aujourd'hui, tous les caractères définis dans la plage 80-FF ne sont pas standard)

De nombreux routeurs de la journée mettent le contrôle de parité et la traduction des octets dans le matériel, forçant les ordinateurs qui leur sont attachés à traiter strictement les données 7 bits. Cela force les pièces jointes aux e-mails (et toutes les autres données, c'est pourquoi les protocoles HTTP et SMTP sont basés sur du texte), à ​​être convertis en un format texte uniquement.

Peu de routeurs ont survécu dans les années 90. Je doute fortement que l'un d'eux soit utilisé aujourd'hui.

James Curran
la source
2
C'est un excellent point de discussion et une intéressante leçon d'histoire, merci.
Dan Bechard
26

Depuis http://en.wikipedia.org/wiki/Base64

Le terme Base64 fait référence à un codage de transfert de contenu MIME spécifique. Il est également utilisé comme terme générique pour tout schéma de codage similaire qui code des données binaires en les traitant numériquement et en les traduisant en une représentation de base 64. Le choix particulier de la base est dû à l'historique de l'encodage des jeux de caractères: on peut choisir un jeu de 64 caractères qui fait à la fois partie du sous-ensemble commun à la plupart des encodages, et également imprimable. Cette combinaison laisse les données peu susceptibles d'être modifiées en transit via des systèmes, tels que les e-mails, qui n'étaient traditionnellement pas propres à 8 bits.

Base64 peut être utilisé dans une variété de contextes:

  • Evolution et Thunderbird utilisent Base64 pour masquer les mots de passe des e-mails [1]
  • Base64 peut être utilisé pour transmettre et stocker du texte qui pourrait autrement provoquer une collision de délimiteur
  • Base64 est souvent utilisé comme un raccourci rapide mais non sécurisé pour obscurcir les secrets sans encourir les frais généraux de gestion des clés cryptographiques

  • Les spammeurs utilisent Base64 pour échapper aux outils de base anti-spam, qui souvent ne décodent pas Base64 et ne peuvent donc pas détecter les mots clés dans les messages codés.

  • Base64 est utilisé pour coder les chaînes de caractères dans les fichiers LDIF
  • Base64 est parfois utilisé pour incorporer des données binaires dans un fichier XML, en utilisant une syntaxe similaire à ...... par exemple bookmarks.html de Firefox.
  • Base64 est également utilisé lors de la communication avec les périphériques d'impression de signature fiscale du gouvernement (généralement, sur des ports série ou parallèles) pour minimiser le délai lors du transfert des caractères de réception pour signature.
  • Base64 est utilisé pour encoder des fichiers binaires tels que des images dans des scripts, pour éviter de dépendre de fichiers externes.
  • Peut être utilisé pour incorporer des données d'image brutes dans une propriété CSS telle que background-image.
garenne
la source
11

Certains protocoles de transport permettent uniquement la transmission de caractères alphanumériques. Imaginez simplement une situation où des caractères de contrôle sont utilisés pour déclencher des actions spéciales et / ou qui ne prennent en charge qu'une largeur de bits limitée par caractère. Base64 transforme n'importe quelle entrée en un codage qui utilise uniquement des caractères alphanumériques +, /et en =tant que caractère de remplissage.

Konrad Rudolph
la source
9

L'utilisation de Base64 que je vais décrire ici est un peu un hack. Donc, si vous n'aimez pas les hacks, veuillez ne pas continuer.

J'ai eu des ennuis quand j'ai découvert que l'utf8 de MySQL ne prend pas en charge les caractères Unicode à 4 octets car il utilise une version à 3 octets d'utf8. Alors, qu'est-ce que j'ai fait pour prendre en charge unicode complet de 4 octets sur utf8 de MySQL? Eh bien, base64 encode les chaînes lors du stockage dans la base de données et décode base64 lors de la récupération.

Étant donné que l'encodage et le décodage base64 sont très rapides, ce qui précède a parfaitement fonctionné.

Vous devez prendre note des points suivants:

  • L'encodage Base64 utilise 33% de stockage en plus

  • Les chaînes stockées dans la base de données ne seront pas lisibles par l'homme (vous pouvez vendre cela comme une fonctionnalité que les chaînes de base de données utilisent une forme de cryptage de base).

Vous pouvez utiliser la méthode ci-dessus pour tout moteur de stockage qui ne prend pas en charge l'unicode.

Basil Musa
la source
6
"Vous pouvez vendre cela comme une fonctionnalité que les chaînes de base de données utilisent une forme de cryptage de base" J'aime votre style: D
Ercan
8
"Vous pourriez vendre cela comme une fonctionnalité que les chaînes de base de données utilisent une forme de cryptage de base" quelle chose horrible à dire: D
Alex
1
forme de base de chiffrement contre toute personne qui n'a pas l'algorithme de décodage base64
rofl
1
@Alex Pas du tout une "chose horrible à dire". Les données sensibles du deuxième degré peuvent être encodées en base64 pour les rendre illisibles par les administrateurs db. Il n'est pas toujours nécessaire d'avoir le niveau de cryptage le plus élevé pour chaque élément de données. Par exemple, si vous souhaitez masquer les "commentaires" d'un administrateur de base de données, la base64 convient au travail. Gratcias!
Basil Musa
1
Il convient de mentionner que MySQL prend désormais en charge tous les Unicode, bien utf8qu'à des fins de compatibilité descendante, leur type est toujours de trois octets; si vous voulez la vraie chose, utilisez utf8mb4. Joli hack, mais plus nécessaire.
TRiG
7

Il est utilisé pour convertir des données binaires arbitraires en texte ASCII.

Par exemple, les pièces jointes sont envoyées de cette façon.

Can Berk Güder
la source
7

Je l'utilise dans un sens pratique lorsque nous transférons de gros objets binaires (images) via des services Web. Ainsi, lorsque je teste un service Web C # à l'aide d'un script python, l'objet binaire peut être recréé avec un peu de magie.

[En python]

import base64
imageAsBytes = base64.b64decode( dataFromWS )
Andrew Cox
la source
1
Les données voyagent-elles plus rapidement?
FelipeM
1
@FelipeM plus lent, pas plus rapide. Base64 a 33% de frais généraux (pour le prix de la sécurité.)
Juraj Il y a
6

«Les schémas de codage Base64 sont couramment utilisés lorsqu'il est nécessaire de coder des données binaires qui doivent être stockées et transférées sur des supports conçus pour traiter des données textuelles. Il s'agit de s'assurer que les données restent intactes sans modification pendant le transport »(Wiki, 2017)

L'exemple pourrait être le suivant: vous disposez d'un service Web qui accepte uniquement les caractères ASCII. Vous souhaitez enregistrer puis transférer les données de l'utilisateur vers un autre emplacement (API), mais le destinataire souhaite recevoir des données intactes. Base64 est pour ça. . . Le seul inconvénient est que l'encodage base64 nécessitera environ 33% plus d'espace que les chaînes régulières.

Un autre exemple :: uenc = url encoded = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = http://loc.querytip.com/asics-men-s-xii .

Comme vous pouvez le voir, nous ne pouvons pas mettre char “/” dans l'URL si nous voulons envoyer la dernière URL visitée comme paramètre car nous enfreindrions la règle d'attribut / valeur pour “MOD réécriture” - paramètre GET.

Un exemple complet serait: « http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product / 93 /

jmr333
la source
4

Généralement, je l'ai vu utilisé pour coder des données binaires dans des contextes qui ne peuvent gérer que des jeux de caractères ascii - ou simples.

Eric Tuttleman
la source
3

Pour développer un peu ce que Brad dit: de nombreux mécanismes de transport pour le courrier électronique et Usenet et d'autres façons de déplacer des données ne sont pas «8 bits propres», ce qui signifie que les caractères en dehors du jeu de caractères ascii standard peuvent être mutilés en transit - par exemple, 0x0D peut être considéré comme un retour chariot et transformé en retour chariot et saut de ligne. La base 64 mappe tous les caractères binaires en plusieurs lettres et chiffres ascii standard et la ponctuation afin qu'ils ne soient pas mutilés de cette façon.

Paul Tomblin
la source
2

Base64

Base64 est un terme générique pour un certain nombre de schémas de codage similaires qui codent des données binaires en les traitant numériquement et en les traduisant en une représentation en base 64. Le terme Base64 provient d'un codage de transfert de contenu MIME spécifique.

Les schémas de codage Base64 sont couramment utilisés lorsqu'il est nécessaire de coder des données binaires qui doivent être stockées et transférées sur des supports conçus pour traiter des données textuelles. Il s'agit de garantir que les données restent intactes sans modification pendant le transport. Base64 est couramment utilisé dans un certain nombre d'applications, notamment le courrier électronique via MIME, et le stockage de données complexes en XML.

mugil k
la source
0

Base64 peut être utilisé à de nombreuses fins.

La raison principale est de convertir les données binaires en quelque chose de passable.

Je l'utilise parfois pour transmettre des données JSON d'un site à un autre, stocker des informations dans des cookies sur un utilisateur.

Remarque: Vous "pouvez" l'utiliser pour le chiffrement - je ne vois pas pourquoi les gens disent que vous ne pouvez pas, et que ce n'est pas du chiffrement, bien qu'il soit facilement cassable et mal vu. Le chiffrement ne signifie rien de plus que la conversion d'une chaîne de données en une autre chaîne de données qui peut être déchiffrée ultérieurement ou non, et c'est ce que fait base64.

Jody Fitzpatrick
la source
2
Vous interprétez la définition du "chiffrement" beaucoup trop littéralement. Le mot est devenu quelque chose d'un peu plus spécifique que ses origines.
Dan Bechard
0

Un chiffre hexadécimal est d'un quartet (4 bits). Deux quartets font 8 bits qui sont également appelés 1 octet.

MD5 génère une sortie de 128 bits qui est représentée à l'aide d'une séquence de 32 chiffres hexadécimaux, qui sont à leur tour 32 * 4 = 128 bits. 128 bits font 16 octets (car 1 octet est 8 bits).

Chaque caractère Base64 code 6 bits (sauf le dernier caractère non-pad qui peut coder 2, 4 ou 6 bits et les derniers caractères de pad, le cas échéant). Par conséquent, par encodage Base64, un hachage 128 bits nécessite au moins ⌈128 / 6⌉ = 22 caractères, plus le pad le cas échéant.

En utilisant base64, nous pouvons produire la sortie codée de notre longueur souhaitée (6, 8 ou 10). Si nous décidons de décider d'une sortie longue de 8 caractères, elle n'occupe que 8 octets alors qu'elle occupait 16 octets pour une sortie de hachage de 128 bits.

Ainsi, en plus de la sécurité, le codage base64 est également utilisé pour réduire l'espace consommé.

Jainabhi
la source