J'ai entendu des gens parler de "codage en base 64" ici et là. A quoi cela sert?
Lorsque vous souhaitez transmettre des données binaires sur un réseau, vous ne le faites généralement pas simplement en transmettant en continu les bits et les octets dans un format brut. Pourquoi? parce que certains médias sont conçus pour la transmission de texte en continu. Vous ne le 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 gâchées parce que le protocole sous-jacent pourrait penser que vous avez entré une combinaison de caractères spéciale (telle que FTP terminaisons).
Donc, pour contourner ce problème, les gens encodent les données binaires en caractères. Base64 est l'un de ces types d'encodage.
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 que vous pouvez être raisonnablement confiant dans le fait que vos données se retrouveront de l’autre côté du réseau sans être corrompues.
C'est en gros une manière d'encoder des données binaires arbitraires en ASCII text. Il faut 4 caractères par 3 octets de données, plus éventuellement un peu de bourrage à la fin.
Chaque 6 bits de l'entrée sont essentiellement codés dans un alphabet de 64 caractères. L'alphabet "standard" utilise A à Z, a à z, 0 à 9 et + et /, avec = comme caractère de remplissage. Il existe des variantes sécurisées pour les URL.
Wikipedia est une assez bonne source d'informations supplémentaires.
Le codage en base 64 permet de convertir des données binaires en texte afin qu’elles soient plus facilement transmises, par exemple, dans les courriers électroniques et les données de formulaire HTML.
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 les données binaires en texte qui viennent immédiatement à l’esprit sont les suivantes:
Base 64 mappe 3 octets (8 x 3 = 24 bits) en 4 caractères de 6 bits (6 x 4 = 24 bits). Le résultat ressemble à "TWFuIGlzIGRpc3Rpb ...". Par conséquent, le ballonnement est à peine 4/3 = 1,3333333 fois l’original.
Outre ce qui a déjà été dit, deux utilisations très courantes qui ne sont pas énumérées sont
Hash:
Les hachages sont des fonctions à sens unique qui transforment un bloc d'octets en un autre bloc d'octets de taille fixe, tels que 128 bits ou 256 bits (SHA/MD5). La conversion des octets obtenus en Base64 facilite grandement l'affichage du hachage, en particulier lorsque vous comparez une somme de contrôle pour l'intégrité. Les hachures sont si souvent vues dans Base64 que beaucoup de gens pensent que Base64 est un hachage.
Cryptographie:
Comme une clé de chiffrement ne doit pas nécessairement ê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 pratique 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 en ses octets d'origine. Elle ne doit donc pas être utilisée comme moyen de protection des données, mais uniquement comme format d'affichage ou de stockage plus simple des octets bruts.
Certificats
les certificats x509 au format PEM sont codés en base 64. http://how2ssl.com/articles/working_with_pem_files/
De 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 en base 64. Le choix particulier de la base est dû à l'historique de l'encodage du jeu de caractères: on peut choisir un ensemble de 64 caractères faisant à la fois partie du sous-ensemble commun à la plupart des encodages et imprimable. Cette combinaison rend les données peu susceptibles d'être modifiées en transit par des systèmes, tels que le courrier électronique, qui n'étaient traditionnellement pas propres.
Base64 peut être utilisé dans divers contextes:
- Evolution et Thunderbird utilisent Base64 pour obscurcir les mots de passe de messagerie [1]
- Base64 peut être utilisé pour transmettre et stocker du texte qui pourrait sinon provoquer une collision de délimiteurs
Base64 est souvent utilisé comme un raccourci rapide mais non sécurisé pour masquer des secrets sans entraîner la surcharge de la gestion des clés cryptographiques.
Les spammeurs utilisent Base64 pour échapper aux outils anti-spam de base, 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 encoder des chaînes de caractères dans des fichiers LDIF
- Base64 est parfois utilisé pour incorporer des données binaires dans un fichier XML, en utilisant une syntaxe similaire à ...... p. Ex. Bookmarks.html de Firefox.
- Base64 est également utilisé lors de la communication avec des périphériques d'impression de signature fiscale du gouvernement (généralement via des ports série ou parallèles) pour réduire le délai lors du transfert des caractères de réception à des fins de signature.
- Base64 est utilisé pour encoder des fichiers binaires tels que des images dans des scripts, afin d'é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.
Aux débuts de l'informatique, lorsque la communication inter-systèmes par 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é de bits". Dans cette méthode, chaque octet transmis aurait 7 bits de données et le 8ème serait égal à 1 ou 0, pour forcer le nombre total de 1 bits dans l'octet à être pair.
Par conséquent, 0x01 serait transmis sous la forme 0x81; 0x02 serait 0x82; 0x03 resterait 0x03 etc.
Pour renforcer ce système, lorsque le jeu de caractères ASCII a été défini, seuls les caractères 00-7F ont été affectés. (Encore aujourd'hui, tous les caractères définis dans la plage 80-FF sont non standard)
La plupart des routeurs du jour insèrent le contrôle de parité et la traduction d'octets dans le matériel, forçant les ordinateurs qui leur sont connectés à traiter strictement les données 7 bits. Cela force les pièces jointes (et toutes les autres données, raison pour laquelle les protocoles HTTP et SMTP sont basés sur du texte) à être converties dans un format texte uniquement.
Peu de routeurs ont survécu dans les années 90. Je doute fort qu'aucun d'entre eux ne soit utilisé aujourd'hui.
Certains protocoles de transport ne permettent que les caractères alphanumériques à transmettre. Imaginez simplement une situation dans laquelle les 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 utilisant uniquement des caractères alphanumériques, +
, /
et le =
en tant que caractère de remplissage.
L'utilisation de Base64 que je vais décrire ici est un peu un hack. Donc, si vous n'aimez pas les hacks, ne continuez pas.
J'ai eu des problèmes lorsque 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 supporter unicode complet sur 4 octets par rapport à l'utf8 de MySQL? Eh bien, base64 encode les chaînes lors du stockage dans la base de données et le décodage en base64 lors de la récupération.
L'encodage et le décodage en base64 étant très rapides, les opérations ci-dessus ont parfaitement fonctionné.
Vous avez les points suivants à prendre en compte:
L'encodage Base64 utilise 33% de stockage supplémentaire
Les chaînes stockées dans la base de données ne seront pas lisibles par l'homme (vous pouvez le vendre en tant que fonctionnalité, car les chaînes de la base de données utilisent un cryptage de base).
Vous pouvez utiliser la méthode ci-dessus pour tout moteur de stockage ne prenant pas en charge unicode.
Il est utilisé pour convertir des données binaires arbitraires en ASCII text.
Par exemple, les pièces jointes sont envoyées de cette manière.
Je l'utilise de manière 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 )
Il y a des années, lorsque la fonctionnalité de mailing a été introduite, elle était donc entièrement basée sur du texte. Au fil du temps, le besoin de pièces jointes telles que l'image et le support (audio, vidéo, etc.) est apparu. Lorsque ces pièces jointes sont envoyées sur Internet (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 aborder ce problème, BASE64 est arrivé.
Le problème des données binaires est qu’elles contiennent des caractères nuls qui, dans certains langages tels que C, C++, représentent une fin de chaîne de caractères. Par conséquent, l’envoi de données binaires sous forme brute contenant des octets NULL empêchera un fichier d’être entièrement lu et entraînera la corruption de données.
Par exemple :
En C et C++, ce caractère "null" indique la fin d'une chaîne. Alors "BONJOUR" est stocké comme ceci:
BONJOUR
72 69 76 76 79 00
Le 00 dit "arrêtez ici".
Voyons maintenant comment fonctionne le codage BASE64.
Point à noter: La longueur de la chaîne doit être multiple de 3.
Exemple 1:
Chaîne à encoder: “ace”, Length = 3
1) Convertissez chaque caractère en décimal.
a = 97, c = 99, e = 101
2) Modifiez chaque représentation décimale en représentation binaire sur 8 bits.
97 = 01100001, 99 = 01100011, 101 = 01100101
Combinés: 01100001 01100011 01100101
3) Séparer dans un groupe de 6 bits.
011000 010110 001101 100101
4) Calculer binaire en décimal
011000 = 24, 010110 = 22, 001101 = 13, 100101 = 37
5) Caractères décimaux dissimulés en base64 à l’aide du graphique base64.
24 = Y, 22 = W, 13 = N, 37 = l
"As" => "YWNl"
Exemple 2:
Chaîne à encoder: “abcd” Longueur = 4, ce n'est pas multiple de 3. Donc, pour que la longueur de chaîne soit multiple de 3, nous devons ajouter un remplissage de 2 bits pour que longueur soit égale à 6. Le bit de remplissage est représenté par le signe “=”.
Point à noter: un bit de remplissage est égal à deux zéros 00, donc deux bits de remplissage est égal à quatre zéros 0000.
Commençons donc le processus: -
1) Convertissez chaque caractère en décimal.
a = 97, b = 98, c = 99, d = 100
2) Modifiez chaque représentation décimale en représentation binaire sur 8 bits.
97 = 01100001, 98 = 01100010, 99 = 01100011, 100 = 01100100
3) Séparer dans un groupe de 6 bits.
011000, 010110, 001001, 100011, 011001, 00
le dernier 6 bits n'est donc 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 indiquent que 4 zéros ont été ajoutés (aide au décodage).
4) Calculer binaire en décimal.
011000 = 24, 010110 = 22, 001001 = 9, 100011 = 35, 011001 = 25, 000000 = 0 ==
5) Caractères décimaux dissimulés en base64 à l’aide du graphique base64.
24 = Y, 22 = W, 9 = j, 35 = j, 25 = Z, 0 = A ==
“Abcd” => “YWJjZA ==”
La plupart du temps, je l’ai vu utilisé pour coder des données binaires dans des contextes ne pouvant gérer que des jeux de caractères ascii ou simples.
Pour en dire un peu plus sur ce que Brad dit: de nombreux mécanismes de transport pour le courrier électronique, Usenet et d’autres méthodes de transfert de données ne sont pas "propres", ce qui signifie que des caractères extérieurs au jeu de caractères ascii standard risquent d’être mutilés en transit - par exemple, 0x0D peut être considéré comme un retour chariot et être transformé en retour chariot et saut de ligne. La base 64 mappe tous les caractères binaires en plusieurs lettres, chiffres et signes de ponctuation ascii standard afin qu'ils ne soient pas mutilés de cette façon.
Base64
Base64 est un terme générique désignant 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 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. Base64 est couramment utilisé dans un certain nombre d'applications, notamment la messagerie électronique via MIME et le stockage de données complexes au format XML.
Base64 peut être utilisé à plusieurs fins.
La principale raison 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, pour stocker des informations dans des cookies concernant un utilisateur.
Remarque: vous "pouvez" l'utiliser pour le chiffrement - je ne vois pas pourquoi les gens disent que vous ne pouvez pas le faire, et que ce n'est pas un chiffrement, bien qu'il soit facile à casser et qu'il soit mal vu. Le cryptage ne signifie rien de plus que la conversion d'une chaîne de données en une autre chaîne de données pouvant être déchiffrée ultérieurement ou non, et c'est ce que fait Base64.