Aus dem Handbuch für base64_encode () : "Diese Codierung soll Binärdaten den Transport durch Transportschichten überleben lassen, die nicht 8-Bit-sauber sind, wie z. B. Postkörper."
still_dreaming_1
Antworten:
940
Wenn Sie einige Binärdaten haben, die Sie über ein Netzwerk versenden möchten, tun Sie dies im Allgemeinen nicht, indem Sie nur die Bits und Bytes in einem Rohformat über die Leitung streamen. Warum? weil einige Medien zum Streamen von Text gemacht sind. Sie wissen es nie - einige Protokolle interpretieren Ihre Binärdaten möglicherweise als Steuerzeichen (wie ein Modem), oder Ihre Binärdaten können durcheinander geraten, weil das zugrunde liegende Protokoll den Eindruck erweckt, dass Sie eine Sonderzeichenkombination eingegeben haben (z. B. wie FTP Zeilen übersetzt) Endungen).
Um dies zu umgehen, codieren die Benutzer die Binärdaten in Zeichen. Base64 ist eine dieser Codierungsarten.
Warum 64?
Da Sie sich im Allgemeinen darauf verlassen können, dass in vielen Zeichensätzen dieselben 64 Zeichen vorhanden sind, können Sie ziemlich sicher sein, dass Ihre Daten unbeschädigt auf der anderen Seite des Kabels landen.
(Theoretisch könnten Sie eine Base-80-Codierung oder ähnliches durchführen, aber es wäre erheblich schwieriger. Zweierpotenzen sind natürliche Basen für Binärdateien.)
Jon Skeet
13
@yokees: Es gibt keine Garantie, es sind nur Charaktere, die fast immer sicher sind. Aus diesem Grund gibt es mehrere Formen von Base-64 ( en.wikipedia.org/wiki/Base-64 ).
8
Bedeutet das, dass alle Datenübertragungen vom Netzwerktyp eine Art Codierung verwenden sollten?
Tanner Summers
6
Aber warum wird die base64-Methode zum Codieren von Zeichenfolgendaten verwendet? zB in der Javascript-Atob-Funktion Bedeutet das, dass der Server eine JSON-Datei in das Base64-Format codiert? Sonderzeichen könnten ein Anwendungsfall sein, aber warum nicht utf8 in diesem Fall, sind sie gleichwertig? Jede weitere Ressource in diesem Zusammenhang wäre sehr dankbar, danke.
Partizanos
4
Eine Liste von mindestens einigen Protokollen, die fehlschlagen würden, wäre schön, wenn jemand es weiß.
Tadej
202
Dies ist im Grunde eine Möglichkeit, beliebige Binärdaten in ASCII-Text zu codieren. Es werden 4 Zeichen pro 3 Datenbytes benötigt, plus möglicherweise ein wenig Auffüllen am Ende.
Im Wesentlichen sind alle 6 Bits der Eingabe in einem 64-stelligen Alphabet codiert. Das "Standard" -Alphabet verwendet AZ, az, 0-9 und + und / mit = als Füllzeichen. Es gibt URL-sichere Varianten.
Wikipedia ist eine ziemlich gute Quelle für weitere Informationen.
In einer Sprache wie PHP werden Binärdaten von kommen. Wir arbeiten fast immer mit Zeichenfolgendaten, bei denen es sich um Text handelt.
Cholthi Paul Ttiopic
3
@CholthiPaulTtiopic: Die Ergebnisse der Verschlüsselung oder Komprimierung oder von Ton / Bild / Video.
Jon Skeet
1
@CholthiPaulTtiopic: Ich fürchte, ich habe keine Ahnung, was Sie unter "Was ist mit Speicher" verstehen, aber an diesem Punkt denke ich, dass wir etwas vom Thema abweichen.
Jon Skeet
2
@CholthiPaulTtiopic: Ich würde es stark vermeiden, in "String Binary" zu denken. Binärdaten sollten als Binärdaten und nicht als Text behandelt werden. Ich habe buchstäblich Hunderte - möglicherweise Tausende - Fragen zu SO gesehen, die sich im Grunde darauf beschränken, dass die Leute sich nicht genug um diese Unterscheidung kümmern.
Die Base-64-Codierung ist eine Möglichkeit, Binärdaten in Text umzuwandeln, damit sie leichter in E-Mail- und HTML-Formulardaten übertragen werden können.
Es ist eine Textcodierung von Binärdaten, bei der der resultierende Text nur Buchstaben, Zahlen und die Symbole "+", "/" und "=" enthält. Es ist eine bequeme Möglichkeit, Binärdaten über Medien zu speichern / zu übertragen, die speziell für Textdaten verwendet werden.
Aber warum Base-64? Die zwei Alternativen zum Konvertieren von Binärdaten in Text, die sofort in den Sinn kommen, sind:
Dezimal: Speichern Sie den Dezimalwert jedes Bytes als drei Zahlen: 045 112 101 037 usw., wobei jedes Byte durch 3 Bytes dargestellt wird. Die Daten blähen sich dreifach auf.
Hexadezimal: Speichern Sie die Bytes als Hex-Paare: AC 47 0D 1A usw., wobei jedes Byte durch 2 Bytes dargestellt wird. Die Daten blähen sich zweifach auf.
Base-64 ordnet 3 Bytes (8 x 3 = 24 Bit) in 4 Zeichen zu, die 6 Bit umfassen (6 x 4 = 24 Bit). Das Ergebnis sieht ungefähr so aus wie "TWFuIGlzIGRpc3Rpb ...". Daher ist das Aufblähen nur das 4/3 = 1,3333333-fache des Originals.
Verstehe ich richtig, dass 64 die beste Wahl ist, da es die höchste Zweierpotenz ist, die in ein druckbares ASCII-Zeichen konvertiert werden kann (es gibt 95 davon)?
Voho
Wenn es sich in beiden Fällen um 24 Bit handelt, ist das dann nicht 1: 1? Oder wenn Sie 4 Zeichen sagen, die 6 Bits umfassen, meinen Sie damit, dass es tatsächlich 8 Bits pro Zeichen gibt, die ersten beiden jedoch mit Nullen aufgefüllt sind?
David Klempfner
1
@Backwards_Dave Alle 6 Bits werden in 8 Bits ausgedrückt. Das Aufblähen beträgt also 8: 6 oder 4: 3.
Ates Goral
82
Abgesehen von dem, was bereits gesagt wurde, gibt es zwei sehr häufige Verwendungen, die nicht aufgeführt wurden
Hashes:
Hashes sind Einwegfunktionen, die einen Byteblock in einen anderen Byteblock fester Größe wie 128 Bit oder 256 Bit (SHA / MD5) umwandeln. Das Konvertieren der resultierenden Bytes in Base64 erleichtert die Anzeige des Hash erheblich, insbesondere wenn Sie eine Prüfsumme auf Integrität vergleichen. Hashes werden in Base64 so oft gesehen, dass viele Leute Base64 selbst als Hash verwechseln.
Kryptographie:
Da ein Verschlüsselungsschlüssel kein Text, sondern Rohbytes sein muss, muss er manchmal in einer Datei oder Datenbank gespeichert werden, für die Base64 nützlich ist. Gleiches gilt für die resultierenden verschlüsselten Bytes.
Beachten Sie, dass Base64 zwar häufig in der Kryptografie verwendet wird, jedoch kein Sicherheitsmechanismus ist. Jeder kann die Base64-Zeichenfolge wieder in ihre ursprünglichen Bytes konvertieren. Sie sollte daher nicht zum Schutz von Daten verwendet werden, sondern nur als Format zum einfacheren Anzeigen oder Speichern von Rohbytes.
In vielen Fällen ist es tatsächlich einfacher, Bytes als Bytes zu speichern. Auch in einer Datenbank und insbesondere in einer Datei (wenn Datensätze mit fester Länge verwendet werden oder die Bytes der einzige Inhalt sind). Base64 wird normalerweise verwendet, wenn diese Bytes irgendwo übertragen werden sollen , insbesondere über einen Kanal, der möglicherweise Bits abschneidet oder einige der Bytes als Steuercodes interpretiert.
CHao
Ich habe noch nie einen Hash gesehen, der als vorzeichenlose 8-Bit-Ganzzahlen (0,1,255,36) geschrieben wurde. Die Anzeige mit UTF-8 oder einer anderen Codierung wäre nicht sinnvoll. Wie würden Sie ihn anders als mit base64 anzeigen? Verschlüsselungsschlüssel und verschlüsselte Daten werden häufig in Konfigurations- und XML-Dateien gespeichert, in denen Sie die Rohbytes nicht speichern können. Ich bin damit einverstanden, dass Sie es auf jeden Fall als Rohbytes speichern können, aber base64 ist für Situationen gedacht, in denen Sie dies nicht können. Es gibt viele Verwendungszwecke von base64, die über das Senden hinausgehen. Dies sind einfach zwei gängige Szenarien, in denen Sie es sehen werden.
Despertar
1
Sie würden den Hash als hexadezimal und nicht als dezimal anzeigen. Bei Hashes ist dies weitaus häufiger als bei base64.
CHao
@cHao Ja, das ist auch üblich. Hexadezimale Ziffern können beliebige Binärdaten darstellen, aber die Basis 64 hat den Vorteil, dass sie viel weniger Platz beansprucht, da sie mehr Zeichen verwendet.
Despertar
45
Vor Jahren, als die Mailing-Funktionalität eingeführt wurde, die im Laufe der Zeit vollständig textbasiert war, bestand Bedarf an Anhängen wie Bild und Medien (Audio, Video usw.). Wenn diese Anhänge über das Internet gesendet werden (im Wesentlichen in Form von Binärdaten), ist die Wahrscheinlichkeit, dass Binärdaten beschädigt werden, in ihrer Rohform hoch. Um dieses Problem anzugehen, kam BASE64.
Das Problem mit Binärdaten besteht darin, dass sie Nullzeichen enthalten, die in einigen Sprachen wie C, C ++ das Ende der Zeichenfolge darstellen. Wenn Sie also Binärdaten in Rohform mit NULL-Bytes senden, wird verhindert, dass eine Datei vollständig gelesen wird und beschädigte Daten enthält.
Beispielsweise :
In C und C ++ zeigt dieses "Null" -Zeichen das Ende einer Zeichenfolge. "HALLO" wird also folgendermaßen gespeichert:
HALLO
72 69 76 76 79 00
Die 00 sagt "hier anhalten".
Lassen Sie uns nun untersuchen, wie die BASE64-Codierung funktioniert.
Zu beachtender Punkt: Die Länge der Zeichenfolge sollte ein Vielfaches von 3 sein.
Beispiel 1 :
Zu codierende Zeichenfolge: "Ass", Länge = 3
1) Konvertieren Sie jedes Zeichen in eine Dezimalzahl.
a = 97, c = 99, e = 101
2) Ändern Sie jede Dezimalzahl in eine 8-Bit-Binärdarstellung.
5) Verdecken Sie Dezimalzeichen mithilfe des base64-Diagramms in base64.
24 = Y, 22 = W, 13 = N, 37 = 1
"Ace" => "YWNl"
Beispiel 2:
Zu codierende Zeichenfolge: "abcd" Länge = 4, es ist kein Vielfaches von 3. Um die Zeichenfolgenlänge zu einem Vielfachen von 3 zu machen, müssen wir 2-Bit-Auffüllung hinzufügen, um Länge = 6 zu machen. Das Auffüllbit wird durch das Zeichen "=" dargestellt.
Zu beachtender Punkt: Ein Füllbit entspricht zwei Nullen 00, also entsprechen zwei Füllbits vier Nullen 0000.
Starten wir also den Prozess: -
1) Konvertieren Sie jedes Zeichen in eine Dezimalzahl.
a = 97, b = 98, c = 99, d = 100
2) Ändern Sie jede Dezimalzahl in eine 8-Bit-Binärdarstellung.
In den frühen Tagen von Computern, als die Kommunikation zwischen Telefonleitungen zwischen Systemen nicht besonders zuverlässig war, wurde eine schnelle und schmutzige Methode zur Überprüfung der Datenintegrität verwendet: "Bitparität". Bei diesem Verfahren hätte jedes übertragene Byte 7 Datenbits und das 8. wäre 1 oder 0, um die Gesamtzahl von 1 Bits im Byte auf gerade zu setzen.
Daher würde 0x01 als 0x81 übertragen; 0x02 wäre 0x82; 0x03 würde 0x03 usw. bleiben
Um dieses System zu fördern, wurden bei der Definition des ASCII-Zeichensatzes nur 00-7F Zeichen zugewiesen. (Noch heute sind alle im Bereich 80-FF eingestellten Zeichen nicht Standard)
Viele Router des Tages setzen die Paritätsprüfung und die Byte-Übersetzung in Hardware um und zwingen die an sie angeschlossenen Computer, streng mit 7-Bit-Daten umzugehen. Dadurch wird erzwungen, dass E-Mail-Anhänge (und alle anderen Daten, weshalb HTTP- und SMTP-Protokolle textbasiert sind) in ein Nur-Text-Format konvertiert werden.
Nur wenige Router überlebten bis in die 90er Jahre. Ich bezweifle stark, dass einer von ihnen heute verwendet wird.
Der Begriff Base64 bezieht sich auf eine bestimmte MIME-Inhaltsübertragungscodierung. Es wird auch als Oberbegriff für jedes ähnliche Codierungsschema verwendet, das Binärdaten codiert, indem es numerisch behandelt und in eine Basis-64-Darstellung übersetzt wird. Die besondere Wahl der Basis ist auf den Verlauf der Zeichensatzcodierung zurückzuführen: Man kann einen Satz von 64 Zeichen auswählen, der sowohl Teil der Teilmenge ist, die den meisten Codierungen gemeinsam ist, als auch druckbar ist. Durch diese Kombination ist es unwahrscheinlich, dass die Daten während der Übertragung durch Systeme wie E-Mail geändert werden, die traditionell nicht 8-Bit-sauber waren.
Base64 kann in verschiedenen Kontexten verwendet werden:
Evolution und Thunderbird verwenden Base64, um E-Mail-Passwörter zu verschleiern. [1]
Base64 kann zum Übertragen und Speichern von Text verwendet werden, der andernfalls eine Trennzeichenkollision verursachen könnte
Base64 wird häufig als schnelle, aber unsichere Verknüpfung verwendet, um Geheimnisse zu verschleiern, ohne den Aufwand für die Verwaltung kryptografischer Schlüssel zu verursachen
Spammer verwenden Base64, um grundlegenden Anti-Spam-Tools auszuweichen, die Base64 häufig nicht dekodieren und daher Schlüsselwörter in verschlüsselten Nachrichten nicht erkennen können.
Base64 wird zum Codieren von Zeichenfolgen in LDIF-Dateien verwendet
Base64 wird manchmal verwendet, um Binärdaten in eine XML-Datei einzubetten, wobei eine Syntax verwendet wird, die der von ...... ähnelt, z. B. bookmarks.html von Firefox.
Base64 wird auch bei der Kommunikation mit staatlichen Drucksignaturdruckgeräten (normalerweise über serielle oder parallele Anschlüsse) verwendet, um die Verzögerung bei der Übertragung von Belegzeichen zum Signieren zu minimieren.
Base64 wird zum Codieren von Binärdateien wie Bildern in Skripten verwendet, um die Abhängigkeit von externen Dateien zu vermeiden.
Kann verwendet werden, um Rohbilddaten in eine CSS-Eigenschaft wie Hintergrundbild einzubetten.
Bei einigen Transportprotokollen können nur alphanumerische Zeichen übertragen werden. Stellen Sie sich eine Situation vor, in der Steuerzeichen zum Auslösen spezieller Aktionen verwendet werden und / oder die nur eine begrenzte Bitbreite pro Zeichen unterstützt. Base64 wandelt jede Eingabe in eine Codierung um, die nur alphanumerische Zeichen verwendet +, /und die =als Auffüllzeichen.
Die Verwendung von Base64, die ich hier beschreiben werde, ist ein Hack. Also, wenn Sie keine Hacks mögen, fahren Sie bitte nicht fort.
Ich bekam Probleme, als ich feststellte, dass mySQLs utf8 keine 4-Byte-Unicode-Zeichen unterstützt, da es eine 3-Byte-Version von utf8 verwendet. Was habe ich getan, um einen vollständigen 4-Byte-Unicode über MySQLs utf8 zu unterstützen? Nun, base64 codiert Zeichenfolgen beim Speichern in der Datenbank und base64 decodiert beim Abrufen.
Da die Base64-Codierung und -Decodierung sehr schnell ist, hat das oben Genannte perfekt funktioniert.
Sie müssen folgende Punkte beachten:
Die Base64-Codierung benötigt 33% mehr Speicherplatz
In der Datenbank gespeicherte Zeichenfolgen sind nicht für Menschen lesbar (Sie können dies als eine Funktion verkaufen, bei der Datenbankzeichenfolgen eine grundlegende Form der Verschlüsselung verwenden).
Sie können die obige Methode für jede Speicher-Engine verwenden, die Unicode nicht unterstützt.
"Sie könnten das als eine Funktion verkaufen, bei der Datenbankzeichenfolgen eine grundlegende Form der Verschlüsselung verwenden." Ich mag Ihren Stil: D
Ercan
8
"Sie könnten das als eine Funktion verkaufen, bei der Datenbankzeichenfolgen eine grundlegende Form der Verschlüsselung verwenden", was für eine schreckliche Sache zu sagen: D
Alex
1
Grundform der Verschlüsselung gegen jeden, der nicht über den Base64-Dekodierungsalgorithmus verfügt rofl: D
Eladian
1
@ Alex Überhaupt keine "schreckliche Sache zu sagen". Sensible Daten zweiten Grades können in Base64-codiert werden, damit sie von Datenbankadministratoren nicht gelesen werden können. Es ist nicht immer erforderlich, für jedes Datenelement die höchste Verschlüsselungsstufe zu haben. Wenn Sie beispielsweise "Kommentare" vor einem Datenbankadministrator verbergen möchten, ist base64 für den Job geeignet. Gratcias!
Basil Musa
1
Es ist erwähnenswert, dass MySQL jetzt alle Unicodes unterstützt, obwohl der utf8Typ aus Gründen der Abwärtskompatibilität immer noch nur drei Bytes beträgt. Wenn Sie die reale Sache wollen, verwenden Sie utf8mb4. Netter Hack, aber nicht mehr nötig.
TRiG
7
Es wird zum Konvertieren beliebiger Binärdaten in ASCII-Text verwendet.
Beispielsweise werden E-Mail-Anhänge auf diese Weise gesendet.
Ich benutze es im praktischen Sinne, wenn wir große binäre Objekte (Bilder) über Webdienste übertragen. Wenn ich also einen C # -Webedienst mit einem Python-Skript teste, kann das Binärobjekt mit etwas Magie neu erstellt werden.
@FelipeM langsamer, nicht schneller. Base64 hat 33% Overhead (zum Preis der Sicherheit)
Juraj vor
6
„Base64-Codierungsschemata werden häufig verwendet, wenn Binärdaten codiert werden müssen, die gespeichert und über Medien übertragen werden müssen, die für den Umgang mit Textdaten ausgelegt sind. Dies soll sicherstellen, dass die Daten während des Transports unverändert bleiben “(Wiki, 2017)
Beispiel könnte das folgende sein: Sie haben einen Webdienst, der nur ASCII-Zeichen akzeptiert. Sie möchten Benutzerdaten speichern und dann an einen anderen Ort (API) übertragen, aber der Empfänger möchte unberührte Daten erhalten. Base64 ist dafür. . . Der einzige Nachteil ist, dass die Base64-Codierung etwa 33% mehr Speicherplatz benötigt als normale Zeichenfolgen.
Wie Sie sehen, können wir das Zeichen "/" nicht in die URL einfügen, wenn wir die zuletzt besuchte URL als Parameter senden möchten, da wir die Attribut- / Wertregel für den Parameter "MOD rewrite" - GET brechen würden.
Um etwas zu erweitern, was Brad sagt: Viele Transportmechanismen für E-Mail und Usenet sowie andere Methoden zum Verschieben von Daten sind nicht "8-Bit-sauber", was bedeutet, dass Zeichen außerhalb des Standard-ASCII-Zeichensatzes während der Übertragung möglicherweise entstellt werden - zum Beispiel 0x0D kann als Wagenrücklauf angesehen und in Wagenrücklauf und Zeilenvorschub umgewandelt werden. Base 64 ordnet alle Binärzeichen mehreren Standard-ASCII-Buchstaben und -Zahlen sowie Satzzeichen zu, damit sie nicht auf diese Weise entstellt werden.
Base64 ist ein Oberbegriff für eine Reihe ähnlicher Codierungsschemata, die Binärdaten codieren, indem sie numerisch behandelt und in eine Base 64-Darstellung übersetzt werden. Der Base64-Begriff stammt aus einer bestimmten MIME-Inhaltsübertragungscodierung.
Base64-Codierungsschemata werden häufig verwendet, wenn Binärdaten codiert werden müssen, die gespeichert und über Medien übertragen werden müssen, die für den Umgang mit Textdaten ausgelegt sind. Dies soll sicherstellen, dass die Daten während des Transports unverändert bleiben. Base64 wird häufig in einer Reihe von Anwendungen verwendet, einschließlich E-Mail über MIME und Speichern komplexer Daten in XML.
Der Hauptgrund ist die Umwandlung von Binärdaten in etwas Passables.
Ich verwende es manchmal, um JSON-Daten von einer Site an eine andere weiterzugeben und Informationen über einen Benutzer in Cookies zu speichern.
Hinweis: Sie können es für die Verschlüsselung "verwenden" - ich verstehe nicht, warum die Leute sagen, dass Sie es nicht können und dass es keine Verschlüsselung ist, obwohl es leicht zerbrechlich wäre und verpönt ist. Verschlüsselung bedeutet nichts anderes als die Konvertierung einer Datenfolge in eine andere Datenfolge, die entweder später entschlüsselt werden kann oder nicht, und genau das tut base64.
Sie interpretieren die Definition von "Verschlüsselung" viel zu wörtlich. Das Wort hat sich zu etwas entwickelt, das ein bisschen spezifischer ist als seine Ursprünge.
Dan Bechard
0
Eine hexadezimale Ziffer besteht aus einem Halbbyte (4 Bits). Zwei Halbbytes ergeben 8 Bits, die auch als 1 Byte bezeichnet werden.
MD5 erzeugt eine 128-Bit-Ausgabe, die mit einer Folge von 32 hexadezimalen Ziffern dargestellt wird, die wiederum 32 * 4 = 128 Bit sind. 128 Bit ergeben 16 Bytes (da 1 Byte 8 Bit ist).
Jedes Base64-Zeichen codiert 6 Bits (mit Ausnahme des letzten Nicht-Pad-Zeichens, das 2, 4 oder 6 Bit codieren kann, und der letzten Pad-Zeichen, falls vorhanden). Daher erfordert ein 128-Bit-Hash pro Base64-Codierung mindestens ⌈128 / 6⌉ = 22 Zeichen plus Pad, falls vorhanden.
Mit base64 können wir die codierte Ausgabe unserer gewünschten Länge (6, 8 oder 10) erzeugen. Wenn wir uns für eine Ausgabe mit 8 Zeichen entscheiden, belegt sie nur 8 Bytes, während sie für die 128-Bit-Hash-Ausgabe 16 Bytes belegt.
Zusätzlich zur Sicherheit wird die Base64-Codierung verwendet, um den Platzbedarf zu reduzieren.
Antworten:
Wenn Sie einige Binärdaten haben, die Sie über ein Netzwerk versenden möchten, tun Sie dies im Allgemeinen nicht, indem Sie nur die Bits und Bytes in einem Rohformat über die Leitung streamen. Warum? weil einige Medien zum Streamen von Text gemacht sind. Sie wissen es nie - einige Protokolle interpretieren Ihre Binärdaten möglicherweise als Steuerzeichen (wie ein Modem), oder Ihre Binärdaten können durcheinander geraten, weil das zugrunde liegende Protokoll den Eindruck erweckt, dass Sie eine Sonderzeichenkombination eingegeben haben (z. B. wie FTP Zeilen übersetzt) Endungen).
Um dies zu umgehen, codieren die Benutzer die Binärdaten in Zeichen. Base64 ist eine dieser Codierungsarten.
Warum 64?
Da Sie sich im Allgemeinen darauf verlassen können, dass in vielen Zeichensätzen dieselben 64 Zeichen vorhanden sind, können Sie ziemlich sicher sein, dass Ihre Daten unbeschädigt auf der anderen Seite des Kabels landen.
quelle
Dies ist im Grunde eine Möglichkeit, beliebige Binärdaten in ASCII-Text zu codieren. Es werden 4 Zeichen pro 3 Datenbytes benötigt, plus möglicherweise ein wenig Auffüllen am Ende.
Im Wesentlichen sind alle 6 Bits der Eingabe in einem 64-stelligen Alphabet codiert. Das "Standard" -Alphabet verwendet AZ, az, 0-9 und + und / mit = als Füllzeichen. Es gibt URL-sichere Varianten.
Wikipedia ist eine ziemlich gute Quelle für weitere Informationen.
quelle
binary strings
. (Quelle) php.net/manual/en/function.pack.phpDie Base-64-Codierung ist eine Möglichkeit, Binärdaten in Text umzuwandeln, damit sie leichter in E-Mail- und HTML-Formulardaten übertragen werden können.
http://en.wikipedia.org/wiki/Base64
quelle
Es ist eine Textcodierung von Binärdaten, bei der der resultierende Text nur Buchstaben, Zahlen und die Symbole "+", "/" und "=" enthält. Es ist eine bequeme Möglichkeit, Binärdaten über Medien zu speichern / zu übertragen, die speziell für Textdaten verwendet werden.
Aber warum Base-64? Die zwei Alternativen zum Konvertieren von Binärdaten in Text, die sofort in den Sinn kommen, sind:
Base-64 ordnet 3 Bytes (8 x 3 = 24 Bit) in 4 Zeichen zu, die 6 Bit umfassen (6 x 4 = 24 Bit). Das Ergebnis sieht ungefähr so aus wie "TWFuIGlzIGRpc3Rpb ...". Daher ist das Aufblähen nur das 4/3 = 1,3333333-fache des Originals.
quelle
Abgesehen von dem, was bereits gesagt wurde, gibt es zwei sehr häufige Verwendungen, die nicht aufgeführt wurden
Hashes:
Hashes sind Einwegfunktionen, die einen Byteblock in einen anderen Byteblock fester Größe wie 128 Bit oder 256 Bit (SHA / MD5) umwandeln. Das Konvertieren der resultierenden Bytes in Base64 erleichtert die Anzeige des Hash erheblich, insbesondere wenn Sie eine Prüfsumme auf Integrität vergleichen. Hashes werden in Base64 so oft gesehen, dass viele Leute Base64 selbst als Hash verwechseln.
Kryptographie:
Da ein Verschlüsselungsschlüssel kein Text, sondern Rohbytes sein muss, muss er manchmal in einer Datei oder Datenbank gespeichert werden, für die Base64 nützlich ist. Gleiches gilt für die resultierenden verschlüsselten Bytes.
Beachten Sie, dass Base64 zwar häufig in der Kryptografie verwendet wird, jedoch kein Sicherheitsmechanismus ist. Jeder kann die Base64-Zeichenfolge wieder in ihre ursprünglichen Bytes konvertieren. Sie sollte daher nicht zum Schutz von Daten verwendet werden, sondern nur als Format zum einfacheren Anzeigen oder Speichern von Rohbytes.
Zertifikate
x509-Zertifikate im PEM-Format sind Base 64-codiert. http://how2ssl.com/articles/working_with_pem_files/
quelle
Vor Jahren, als die Mailing-Funktionalität eingeführt wurde, die im Laufe der Zeit vollständig textbasiert war, bestand Bedarf an Anhängen wie Bild und Medien (Audio, Video usw.). Wenn diese Anhänge über das Internet gesendet werden (im Wesentlichen in Form von Binärdaten), ist die Wahrscheinlichkeit, dass Binärdaten beschädigt werden, in ihrer Rohform hoch. Um dieses Problem anzugehen, kam BASE64.
Das Problem mit Binärdaten besteht darin, dass sie Nullzeichen enthalten, die in einigen Sprachen wie C, C ++ das Ende der Zeichenfolge darstellen. Wenn Sie also Binärdaten in Rohform mit NULL-Bytes senden, wird verhindert, dass eine Datei vollständig gelesen wird und beschädigte Daten enthält.
Beispielsweise :
In C und C ++ zeigt dieses "Null" -Zeichen das Ende einer Zeichenfolge. "HALLO" wird also folgendermaßen gespeichert:
HALLO
72 69 76 76 79 00
Die 00 sagt "hier anhalten".
Lassen Sie uns nun untersuchen, wie die BASE64-Codierung funktioniert.
Zu beachtender Punkt: Die Länge der Zeichenfolge sollte ein Vielfaches von 3 sein.
Beispiel 1 :
Zu codierende Zeichenfolge: "Ass", Länge = 3
1) Konvertieren Sie jedes Zeichen in eine Dezimalzahl.
a = 97, c = 99, e = 101
2) Ändern Sie jede Dezimalzahl in eine 8-Bit-Binärdarstellung.
97 = 01100001, 99 = 01100011, 101 = 01100101
Kombiniert: 01100001 01100011 01100101
3) Trennen Sie sich in einer Gruppe von 6-Bit.
011000 010110 001101 100101
4) Berechnen Sie Binär zu Dezimal
011000 = 24, 010110 = 22, 001101 = 13, 100101 = 37
5) Verdecken Sie Dezimalzeichen mithilfe des base64-Diagramms in base64.
24 = Y, 22 = W, 13 = N, 37 = 1
"Ace" => "YWNl"
Beispiel 2:
Zu codierende Zeichenfolge: "abcd" Länge = 4, es ist kein Vielfaches von 3. Um die Zeichenfolgenlänge zu einem Vielfachen von 3 zu machen, müssen wir 2-Bit-Auffüllung hinzufügen, um Länge = 6 zu machen. Das Auffüllbit wird durch das Zeichen "=" dargestellt.
Zu beachtender Punkt: Ein Füllbit entspricht zwei Nullen 00, also entsprechen zwei Füllbits vier Nullen 0000.
Starten wir also den Prozess: -
1) Konvertieren Sie jedes Zeichen in eine Dezimalzahl.
a = 97, b = 98, c = 99, d = 100
2) Ändern Sie jede Dezimalzahl in eine 8-Bit-Binärdarstellung.
97 = 01100001, 98 = 01100010, 99 = 01100011, 100 = 01100100
3) Trennen Sie in einer Gruppe von 6-Bit.
011000, 010110, 001001, 100011, 011001, 00
Da das letzte 6-Bit nicht vollständig ist, fügen wir zwei Füllbits ein, die vier Nullen „0000“ entsprechen.
011000, 010110, 001001, 100011, 011001, 000000 ==
Jetzt ist es gleich. Zwei Gleichheitszeichen am Ende zeigen an, dass 4 Nullen hinzugefügt wurden (hilft beim Decodieren).
4) Berechnen Sie Binär zu Dezimal.
011000 = 24, 010110 = 22, 001001 = 9, 100011 = 35, 011001 = 25, 000000 = 0 ==
5) Verdecken Sie Dezimalzeichen mithilfe des base64-Diagramms in base64.
24 = Y, 22 = W, 9 = j, 35 = j, 25 = Z, 0 = A ==
"Abcd" => "YWJjZA =="
quelle
In den frühen Tagen von Computern, als die Kommunikation zwischen Telefonleitungen zwischen Systemen nicht besonders zuverlässig war, wurde eine schnelle und schmutzige Methode zur Überprüfung der Datenintegrität verwendet: "Bitparität". Bei diesem Verfahren hätte jedes übertragene Byte 7 Datenbits und das 8. wäre 1 oder 0, um die Gesamtzahl von 1 Bits im Byte auf gerade zu setzen.
Daher würde 0x01 als 0x81 übertragen; 0x02 wäre 0x82; 0x03 würde 0x03 usw. bleiben
Um dieses System zu fördern, wurden bei der Definition des ASCII-Zeichensatzes nur 00-7F Zeichen zugewiesen. (Noch heute sind alle im Bereich 80-FF eingestellten Zeichen nicht Standard)
Viele Router des Tages setzen die Paritätsprüfung und die Byte-Übersetzung in Hardware um und zwingen die an sie angeschlossenen Computer, streng mit 7-Bit-Daten umzugehen. Dadurch wird erzwungen, dass E-Mail-Anhänge (und alle anderen Daten, weshalb HTTP- und SMTP-Protokolle textbasiert sind) in ein Nur-Text-Format konvertiert werden.
Nur wenige Router überlebten bis in die 90er Jahre. Ich bezweifle stark, dass einer von ihnen heute verwendet wird.
quelle
Von http://en.wikipedia.org/wiki/Base64
quelle
Bei einigen Transportprotokollen können nur alphanumerische Zeichen übertragen werden. Stellen Sie sich eine Situation vor, in der Steuerzeichen zum Auslösen spezieller Aktionen verwendet werden und / oder die nur eine begrenzte Bitbreite pro Zeichen unterstützt. Base64 wandelt jede Eingabe in eine Codierung um, die nur alphanumerische Zeichen verwendet
+
,/
und die=
als Auffüllzeichen.quelle
Die Verwendung von Base64, die ich hier beschreiben werde, ist ein Hack. Also, wenn Sie keine Hacks mögen, fahren Sie bitte nicht fort.
Ich bekam Probleme, als ich feststellte, dass mySQLs utf8 keine 4-Byte-Unicode-Zeichen unterstützt, da es eine 3-Byte-Version von utf8 verwendet. Was habe ich getan, um einen vollständigen 4-Byte-Unicode über MySQLs utf8 zu unterstützen? Nun, base64 codiert Zeichenfolgen beim Speichern in der Datenbank und base64 decodiert beim Abrufen.
Da die Base64-Codierung und -Decodierung sehr schnell ist, hat das oben Genannte perfekt funktioniert.
Sie müssen folgende Punkte beachten:
Die Base64-Codierung benötigt 33% mehr Speicherplatz
In der Datenbank gespeicherte Zeichenfolgen sind nicht für Menschen lesbar (Sie können dies als eine Funktion verkaufen, bei der Datenbankzeichenfolgen eine grundlegende Form der Verschlüsselung verwenden).
Sie können die obige Methode für jede Speicher-Engine verwenden, die Unicode nicht unterstützt.
quelle
utf8
Typ aus Gründen der Abwärtskompatibilität immer noch nur drei Bytes beträgt. Wenn Sie die reale Sache wollen, verwenden Sieutf8mb4
. Netter Hack, aber nicht mehr nötig.Es wird zum Konvertieren beliebiger Binärdaten in ASCII-Text verwendet.
Beispielsweise werden E-Mail-Anhänge auf diese Weise gesendet.
quelle
Ich benutze es im praktischen Sinne, wenn wir große binäre Objekte (Bilder) über Webdienste übertragen. Wenn ich also einen C # -Webedienst mit einem Python-Skript teste, kann das Binärobjekt mit etwas Magie neu erstellt werden.
[In Python]
quelle
„Base64-Codierungsschemata werden häufig verwendet, wenn Binärdaten codiert werden müssen, die gespeichert und über Medien übertragen werden müssen, die für den Umgang mit Textdaten ausgelegt sind. Dies soll sicherstellen, dass die Daten während des Transports unverändert bleiben “(Wiki, 2017)
Beispiel könnte das folgende sein: Sie haben einen Webdienst, der nur ASCII-Zeichen akzeptiert. Sie möchten Benutzerdaten speichern und dann an einen anderen Ort (API) übertragen, aber der Empfänger möchte unberührte Daten erhalten. Base64 ist dafür. . . Der einzige Nachteil ist, dass die Base64-Codierung etwa 33% mehr Speicherplatz benötigt als normale Zeichenfolgen.
Ein weiteres Beispiel: uenc = url encoded = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = http://loc.querytip.com/asics-men-s-gel .
Wie Sie sehen, können wir das Zeichen "/" nicht in die URL einfügen, wenn wir die zuletzt besuchte URL als Parameter senden möchten, da wir die Attribut- / Wertregel für den Parameter "MOD rewrite" - GET brechen würden.
Ein vollständiges Beispiel wäre: „ http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product / 93 / ”
quelle
Meistens habe ich gesehen, dass damit Binärdaten in Kontexten codiert werden, die nur ASCII- oder einfache Zeichensätze verarbeiten können.
quelle
Um etwas zu erweitern, was Brad sagt: Viele Transportmechanismen für E-Mail und Usenet sowie andere Methoden zum Verschieben von Daten sind nicht "8-Bit-sauber", was bedeutet, dass Zeichen außerhalb des Standard-ASCII-Zeichensatzes während der Übertragung möglicherweise entstellt werden - zum Beispiel 0x0D kann als Wagenrücklauf angesehen und in Wagenrücklauf und Zeilenvorschub umgewandelt werden. Base 64 ordnet alle Binärzeichen mehreren Standard-ASCII-Buchstaben und -Zahlen sowie Satzzeichen zu, damit sie nicht auf diese Weise entstellt werden.
quelle
Base64
Base64 ist ein Oberbegriff für eine Reihe ähnlicher Codierungsschemata, die Binärdaten codieren, indem sie numerisch behandelt und in eine Base 64-Darstellung übersetzt werden. Der Base64-Begriff stammt aus einer bestimmten MIME-Inhaltsübertragungscodierung.
Base64-Codierungsschemata werden häufig verwendet, wenn Binärdaten codiert werden müssen, die gespeichert und über Medien übertragen werden müssen, die für den Umgang mit Textdaten ausgelegt sind. Dies soll sicherstellen, dass die Daten während des Transports unverändert bleiben. Base64 wird häufig in einer Reihe von Anwendungen verwendet, einschließlich E-Mail über MIME und Speichern komplexer Daten in XML.
quelle
Base64 kann für viele Zwecke verwendet werden.
Der Hauptgrund ist die Umwandlung von Binärdaten in etwas Passables.
Ich verwende es manchmal, um JSON-Daten von einer Site an eine andere weiterzugeben und Informationen über einen Benutzer in Cookies zu speichern.
Hinweis: Sie können es für die Verschlüsselung "verwenden" - ich verstehe nicht, warum die Leute sagen, dass Sie es nicht können und dass es keine Verschlüsselung ist, obwohl es leicht zerbrechlich wäre und verpönt ist. Verschlüsselung bedeutet nichts anderes als die Konvertierung einer Datenfolge in eine andere Datenfolge, die entweder später entschlüsselt werden kann oder nicht, und genau das tut base64.
quelle
Eine hexadezimale Ziffer besteht aus einem Halbbyte (4 Bits). Zwei Halbbytes ergeben 8 Bits, die auch als 1 Byte bezeichnet werden.
MD5 erzeugt eine 128-Bit-Ausgabe, die mit einer Folge von 32 hexadezimalen Ziffern dargestellt wird, die wiederum 32 * 4 = 128 Bit sind. 128 Bit ergeben 16 Bytes (da 1 Byte 8 Bit ist).
Jedes Base64-Zeichen codiert 6 Bits (mit Ausnahme des letzten Nicht-Pad-Zeichens, das 2, 4 oder 6 Bit codieren kann, und der letzten Pad-Zeichen, falls vorhanden). Daher erfordert ein 128-Bit-Hash pro Base64-Codierung mindestens ⌈128 / 6⌉ = 22 Zeichen plus Pad, falls vorhanden.
Mit base64 können wir die codierte Ausgabe unserer gewünschten Länge (6, 8 oder 10) erzeugen. Wenn wir uns für eine Ausgabe mit 8 Zeichen entscheiden, belegt sie nur 8 Bytes, während sie für die 128-Bit-Hash-Ausgabe 16 Bytes belegt.
Zusätzlich zur Sicherheit wird die Base64-Codierung verwendet, um den Platzbedarf zu reduzieren.
quelle