web-dev-qa-db-fra.com

Pourquoi utilisons-nous Base64?

Wikipedia dit

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 un support conçu pour traiter des données textuelles. Cela permet de garantir que les données restent intactes sans modification pendant le transport.

Mais n’est-ce pas que les données sont toujours stockées/transmises en binaire car la mémoire de nos machines enregistre binaire et cela dépend de la façon dont vous l’interprétez? Donc, que vous encodiez le motif de bits 010011010110000101101110 comme Man dans ASCII ou comme TWFu en Base64, vous allez éventuellement stocker le même motif binaire.

Si le codage ultime concerne les zéros et les uns et que toutes les machines et tous les supports peuvent les gérer, quelle importance ait le fait que les données soient représentées sous la forme ASCII ou Base64?

Que signifie "un média conçu pour traiter des données textuelles"? Ils peuvent traiter avec binaire => ils peuvent traiter avec n'importe quoi.


Merci à tous, je pense que je comprends maintenant.

Lorsque nous envoyons des données, nous ne pouvons pas être sûrs que les données seraient interprétées dans le même format que nous le pensions. Nous envoyons donc des données codées dans un format (tel que Base64) que les deux parties comprennent. De cette façon, même si l'expéditeur et le destinataire interprètent les mêmes choses différemment, mais parce qu'ils s'accordent sur le format codé, les données ne seront pas interprétées de manière erronée.

De exemple de Mark Byers

Si je veux envoyer

Hello
world!

Une solution consiste à l'envoyer à ASCII comme

72 101 108 108 111 10 119 111 114 108 100 33

Mais l'octet 10 pourrait ne pas être interprété correctement comme une nouvelle ligne à l'autre bout. Donc, nous utilisons un sous-ensemble de ASCII pour l'encoder comme ceci

83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61

ce qui, au prix de davantage de données transférées pour la même quantité d’informations, garantit que le destinataire peut décoder les données de la manière prévue, même si le destinataire a des interprétations différentes pour le reste du jeu de caractères.

233
Lazer

Votre première erreur est de penser que le codage ASCII et le codage Base64 sont interchangeables. Ils ne sont pas. Ils sont utilisés à des fins différentes.

  • Lorsque vous codez du texte en ASCII, vous commencez par une chaîne de texte et convertissez-la en une séquence d'octets.
  • Lorsque vous codez des données en Base64, vous commencez par une séquence d'octets et convertissez-les en chaîne de texte.

Pour comprendre pourquoi Base64 était nécessaire en premier lieu, il nous faut un peu d’histoire de l’informatique.


Les ordinateurs communiquent en binaire - 0 et 1 - mais les utilisateurs souhaitent généralement communiquer avec des données de formulaires plus riches, telles que du texte ou des images. Pour transférer ces données entre ordinateurs, elles doivent d'abord être codées en 0 et en 1, envoyées puis décodées à nouveau. Pour prendre un texte à titre d'exemple, il existe de nombreuses manières différentes d'effectuer cet encodage. Ce serait beaucoup plus simple si nous pouvions tous nous mettre d'accord sur un seul encodage, mais malheureusement, ce n'est pas le cas.

À l'origine, de nombreux codages différents avaient été créés (par exemple code Baudot ), lesquels utilisaient un nombre différent de bits par caractère jusqu'à ce que ASCII devienne un standard à 7 bits par caractère. Cependant, la plupart des ordinateurs stockent des données binaires sous forme d'octets de 8 bits chacun, donc [~ # ~] ascii [~ # ~] n'est pas adapté au transfert de ce type de données. Certains systèmes effaceraient même le bit le plus significatif. De plus, la différence entre les codages de fin de ligne d'un système à l'autre signifie que les caractères ASCII 10 et 13 ont également été parfois modifiés.

Pour résoudre ces problèmes Base64 l'encodage a été introduit. Cela vous permet de coder des octets aribtrary en octets dont on sait qu’ils peuvent être envoyés en toute sécurité sans être altérés (caractères alphanumériques ASCII et quelques symboles). L'inconvénient est que le codage du message à l'aide de Base64 augmente sa longueur: tous les 3 octets de données sont codés en 4 ASCII caractères.

Pour envoyer du texte de manière fiable, vous pouvez d'abord encoder des octets en utilisant un encodage de texte de votre choix (par exemple UTF-8), puis ultérieurement Base64 encode les données binaires obtenues en une chaîne de texte pouvant être envoyée en toute sécurité et encodée en ASCII. Le destinataire devra inverser ce processus pour récupérer le message d'origine. Cela nécessite bien sûr que le récepteur sache quels codages ont été utilisés et cette information doit souvent être envoyée séparément.

Historiquement, il a été utilisé pour coder des données binaires dans des messages électroniques, le serveur de messagerie pouvant modifier les fins de ligne. Un exemple plus moderne est l’utilisation du codage Base64 pour incorporer des données d’image directement dans le code source HTML . Ici, il est nécessaire de coder les données pour éviter que des caractères tels que '<' et '>' soient interprétés comme des balises.


Voici un exemple travaillé:

Je souhaite envoyer un SMS avec deux lignes

Bonjour le monde!

Si je l’envoie en tant que ASCII (ou UTF-8), cela ressemblera à ceci:

72 101 108 108 111 10 119 111 114 108 100 33

L'octet 10 est corrompu sur certains systèmes. Nous pouvons donc coder en base 64 ces octets sous forme de chaîne Base64:

SGVsbG8sCndvcmxkIQ ==

Ce qui, une fois encodé avec ASCII, ressemble à ceci:

83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61

Tous les octets ici sont des octets sûrs connus. Il y a donc très peu de chance qu'un système corrompe ce message. Je peux envoyer ceci au lieu de mon message d'origine et laisser le destinataire inverser le processus pour récupérer le message d'origine.

245
Mark Byers

Encodage de données binaires en XML

Supposons que vous souhaitiez intégrer quelques images dans un document XML. Les images sont des données binaires, alors que le document XML est du texte. Mais XML ne peut pas gérer les données binaires incorporées. Alors, comment fais-tu?

Une option consiste à coder les images en base64, en convertissant les données binaires en un texte que XML peut gérer.

Au lieu de:

<images>
  <image name="Sally">{binary gibberish that breaks XML parsers}</image>
  <image name="Bobby">{binary gibberish that breaks XML parsers}</image>
</images>

vous faites:

<images>
  <image name="Sally" encoding="base64">j23894uaiAJSD3234kljasjkSD...</image>
  <image name="Bobby" encoding="base64">Ja3k23JKasil3452AsdfjlksKsasKD...</image>
</images>

De plus, l'analyseur XML pourra analyser correctement le document XML et extraire les données d'image.

56
yfeldblum

Pourquoi ne pas regarder le RFC qui définit actuellement Base64 ?

Le codage de base des données est utilisé dans de nombreuses situations pour stocker ou transférer
données dans des environnements qui, peut-être pour des raisons héritées du passé, sont limitées aux données US-ASCII [1]. Le codage de base peut également être utilisé dans les nouvelles applications ne disposant pas de restrictions héritées, simplement parce qu'il permet objets avec des éditeurs de texte.

Dans le passé, différentes applications avaient des exigences différentes et implémentaient donc parfois des codages de base de manière légèrement différente. Aujourd'hui, les spécifications de protocole utilisent parfois des codages de base en général, et "base64" en particulier, sans description ni référence précise. MIME (Multipurpose Internet Mail Extensions) [4] est souvent utilisé comme référence pour base64 sans tenir compte des conséquences pour les caractères de retour à la ligne ou les caractères non alphabétiques. Le but de cette spécification est d’établir des considérations communes concernant l’alphabet et le codage. Espérons que cela réduira l'ambiguïté dans d'autres documents, ce qui améliorera l'interopérabilité.

Base64 a été conçu à l'origine pour permettre aux données binaires d'être attachées à des courriels dans le cadre des extensions de messagerie Internet polyvalentes.

35
Billy ONeal

Les supports conçus pour les données textuelles sont bien entendu également binaires, mais les supports textuels utilisent souvent certaines valeurs binaires pour les caractères de contrôle. En outre, les supports textuels peuvent rejeter certaines valeurs binaires en tant que non-texte.

L'encodage Base64 encode les données binaires en tant que valeurs pouvant uniquement être interprétées sous forme de texte dans un support textuel. Il ne contient aucun caractère spécial et/ou caractère de contrôle, de sorte que les données sont également conservées sur un support textuel.

26
Håvard S

C’est plus que le support valide le codage de la chaîne, nous voulons donc nous assurer que les données sont acceptables pour une application de traitement (et ne contiennent pas séquence binaire représentant EOL par exemple)

Imaginez que vous souhaitiez envoyer des données binaires dans un courrier électronique avec le codage UTF-8 - Le courrier électronique risque de ne pas s'afficher correctement si le flux de uns et de zéros crée une séquence qui n’est pas valide en Unicode dans le codage UTF-8.

Le même type de chose se produit dans les URL lorsque nous voulons coder des caractères non valides pour une URL dans l'URL elle-même:

http://www.foo.com/hello mon ami -> http://www.foo.com/hello%20my%20friend

C'est parce que nous voulons envoyer un espace sur un système qui va penser que l'espace est malodorant.

Nous veillons simplement à établir une correspondance 1 pour 1 entre une séquence de bits connue, acceptable et non préjudiciable avec une autre séquence de bits littérale, et que l'application de traitement ne le soit pas. 'distingue pas l'encodage.

Dans votre exemple, man peut être valide ASCII sous la première forme; mais vous souhaiterez souvent transmettre des valeurs binaires aléatoires (c'est-à-dire envoyer une image dans un courrier électronique):

MIME-Version: 1.0
Contenu-Description: "Encodage en base64 de a.gif"
Content-Type: image/gif; nom = "a.gif"
Codage de transfert de contenu: Base64
Content-Disposition: attachement; filename = "a.gif"

Nous voyons ici qu'une image GIF est codée en base64 sous la forme d'un bloc d'e-mail. Le client de messagerie lit les en-têtes et les décode. En raison de l'encodage, nous pouvons être certains que le fichier GIF ne contient rien qui puisse être interprété comme un protocole et nous évitons d'insérer des données que SMTP ou POP peuvent trouver importantes.

16
Aiden Bell

Un exemple de quand j'ai trouvé cela pratique était en essayant de incorporer des données binaires en XML . Certaines des données binaires ont été mal interprétées par l’analyseur SAX car ces données pouvaient être littéralement n'importe quoi, y compris les caractères spéciaux XML. Ce problème a été résolu par le codage Base64 des données du côté émetteur et leur décodage par le destinataire.

12
Bill the Lizard

Base64 au lieu d'échapper aux caractères spéciaux

Je vais vous donner un exemple très différent mais réel: j’écris du code javascript à exécuter dans un navigateur. Les balises HTML ont des valeurs d’ID, mais il existe des contraintes sur les caractères valides dans un ID.

Mais je veux que mon identifiant fasse référence sans perte aux fichiers de mon système de fichiers. Les fichiers en réalité peuvent contenir toutes sortes de personnages étranges et merveilleux, notamment des points d'exclamation, des caractères accentués, des tilde et même des emoji! Je ne peux pas faire ça:

<div id="/path/to/my_strangely_named_file!@().jpg">
    <img src="http://myserver.com/path/to/my_strangely_named_file!@().jpg">
    Here's a pic I took in Moscow.
</div>

Supposons que je veuille exécuter du code comme ceci:

# ERROR
document.getElementById("/path/to/my_strangely_named_file!@().jpg");

Je pense que ce code échouera lorsqu'il sera exécuté.

Avec Base64, je peux me référer à quelque chose de compliqué sans me soucier de la langue qui autorise quels caractères spéciaux et de ceux qui doivent être évités:

document.getElementById("18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA");

Contrairement à l'utilisation d'un MD5 ou d'une autre fonction de hachage, vous pouvez inverser le codage pour déterminer les données réellement utiles.

J'aurais aimé connaître Base64 il y a des années. J’aurais évité d’arracher mes cheveux avec ‘encodeURIComponent’ et str.replace(‘\n’,’\\n’)

Transfert SSH de texte:

Si vous essayez de transmettre des données complexes sur ssh (par exemple, un fichier de points afin que vous puissiez obtenir les personnalisations de Shell), bonne chance pour le faire sans Base 64. C’est ce que vous feriez avec la base 64 (je sais que vous pouvez utiliser SCP, mais cela prendrait plusieurs commandes - ce qui complique les liaisons de clé pour sshing sur un serveur):

11
Sridhar Sarnobat

La plupart des ordinateurs stockent les données au format binaire 8 bits, mais cela n'est pas obligatoire. Certaines machines et certains supports de transmission ne peuvent gérer que 7 bits (voire moins) à la fois. Un tel support interpréterait le flux en multiples de 7 bits. Par conséquent, si vous envoyez des données 8 bits, vous ne recevrez pas ce que vous attendiez de l'autre côté. La base 64 n’est qu’un moyen de résoudre ce problème: vous codez l’entrée au format 6 bits, vous la transmettez sur votre support et vous la décodez au format 8 bits à la réception.

10
casablanca

Que signifie "un média conçu pour traiter des données textuelles"?

Que ces protocoles ont été conçus pour gérer du texte (souvent, seulement anglais texte) au lieu de données binaires (comme des images .png et .jpg).

Ils peuvent traiter avec binaire => ils peuvent traiter avec n'importe quoi.

Mais l'inverse n'est pas vrai. Un protocole conçu pour représenter du texte peut traiter de manière incorrecte des données binaires contenant:

  • Les octets 0x0A et 0x0D, utilisés pour les fins de ligne, diffèrent par la plate-forme.
  • Autres caractères de contrôle tels que 0x00 (NULL = terminateur de chaîne C), 0x03 (FIN DE TEXTE), 0x04 (FIN DE TRANSMISSION) ou 0x1A (fin de fichier DOS) pouvant signaler prématurément la fin des données.
  • Octets supérieurs à 0x7F (si le protocole conçu pour ASCII).
  • Séquences d'octets non valides UTF-8.

Vous ne pouvez donc pas simplement envoyer des données binaires via un protocole textuel. Vous êtes limité aux octets qui représentent le non-contrôle non-spatial ASCII caractères, il y en a 94). La raison pour laquelle la base 64 a été choisie est qu'il est plus rapide de travailler avec des puissances de deux et 64 est le plus important qui fonctionne.

Une question cependant. Comment se fait-il que les systèmes ne sont toujours pas d’accord sur une technique de codage commune telle que le très courant UTF-8?

Sur le Web, au moins, ils ont la plupart du temps. ne majorité de sites utilise UTF-8 .

Le problème en Occident, c’est qu’il ya beaucoup de vieux logiciels qui supposent que 1 octet = 1 caractère et ne peuvent pas fonctionner avec UTF-8.

Le problème à l'Est est leur attachement à des encodages tels que GB2312 et Shift_JIS.

Et le fait que Microsoft ne semble toujours pas avoir résolu le problème du mauvais codage UTF. Si vous souhaitez utiliser l'API Windows ou la bibliothèque d'exécution Microsoft C, vous êtes limité au codage UTF-16 ou "ANSI" des paramètres régionaux. Il est donc douloureux d’utiliser UTF-8 car vous devez convertir tout le temps.

6
dan04

En plus des autres réponses (un peu longues): même en ignorant les anciens systèmes ne prenant en charge que l’ASCII 7 bits, les problèmes de base liés à la fourniture de données binaires en mode texte sont les suivants:

  • Les nouvelles lignes sont généralement transformées en mode texte.
  • Faites attention à ne pas traiter un octet NUL comme la fin d'une chaîne de texte, ce qui est trop facile à faire dans n'importe quel programme avec la lignée C.
5
jamesdlin

Pourquoi/Comment utilisons-nous le codage Base64?

Base64 est l’un des schémas de codage binaire-texte ayant une efficacité de 75%. Il est utilisé de manière à ce que des données binaires typiques (telles que des images) puissent être envoyées en toute sécurité sur des canaux hérités "non nettoyés en 8 bits". Dans les réseaux de messagerie précédents (jusqu'au début des années 90), la plupart des messages électroniques étaient en texte brut dans le jeu de caractères US-ASCII 7 bits. Tant de normes de protocole de communication précoces ont été conçues pour fonctionner sur des "liaisons de communication 7 bits" et non "propres". L'efficacité du schéma est le rapport entre le nombre de bits de l'entrée et le nombre de bits de la sortie codée. Hexadécimal (Base16) est également l’un des schémas de codage binaire-texte avec une efficacité de 50%.

Étapes d’encodage Base64 (simplifié):

  1. Les données binaires sont organisées en blocs continus de 24 bits (3 octets) chacun.
  2. Chaque bloc de 24 bits est regroupé en quatre parties de 6 bits.
  3. Chaque groupe de 6 bits est converti en leurs valeurs de caractères Base64 correspondantes, c'est-à-dire que le codage Base64 convertit trois octets en quatre caractères codés. Le rapport entre les octets de sortie et les octets d'entrée est de 4: 3 (surcharge de 33%).
  4. Fait intéressant, les mêmes caractères seront codés différemment en fonction de leur position dans le groupe de trois octets codé pour produire les quatre caractères.
  5. Le destinataire devra inverser ce processus pour récupérer le message d'origine.
5
Mushtaq Hussain

Que signifie "un média conçu pour traiter des données textuelles"?

À l'époque où ASCII a jugé que le monde qui traitait avec les valeurs non-ASCII était un casse-tête. Les gens ont sauté dans toutes sortes d'objectifs pour les transférer sur le réseau sans perdre d'informations.

3
dirkgently