2010-01-18 7 views
7

Wenn Sie Binärdaten haben, die Sie kodieren müssen, welches Kodierungsschema verwenden Sie?Welches Kodierungsschema verwenden Sie, wenn Sie Binärdaten haben, die Sie über einen ASCII-Kanal senden müssen?

Ich kenne:

  • Hex encoding. Sehr einfach, aber ziemlich ausführlich, erweitert ein Byte auf zwei.
  • Base 64. Am häufigsten, nicht so ausführlich, werden drei Bytes zu vier erweitert.
  • Base 85. Nicht üblich, weniger wieder ausführlich, erweitert vier Bytes auf fünf.

Gibt es noch andere Kodierungsschemata, die allgemein verwendet werden? Wenn ja, worin bestehen Vor- und Nachteile?

Bearbeiten: Dies ist zum Beispiel nützlich, wenn Sie versuchen, beliebige Daten in einem Cookie zu speichern. Cookies können nur Text speichern, keine willkürlichen Daten, daher müssen Sie sie in irgendeiner Weise konvertieren, vorzugsweise mit einer Möglichkeit, sie zurück zu konvertieren. Nehmen Sie weiterhin an, dass Sie einen zustandslosen Server verwenden, sodass Sie den Status nicht auf dem Server speichern und nur einen Bezeichner in den Cookie einfügen können. Wenn Sie dies tun, müssen Sie natürlich auch sicherstellen, dass das, was der Benutzer an Sie zurückgibt, das ist, was Sie an den Benutzer weitergegeben haben, zum Beispiel eine Signatur.

Auch da der aktuelle Konsens ist, dass Sie Base64 verwenden sollten, da es weit verbreitet ist, werde ich auch darauf hinweisen, dass diese ist, was ich benutze ... Ich bin nur neugierig, ob jemand noch etwas verwendet, und wenn ja , Warum.

bearbeiten: Nur falls jemand über diese stolpert, wenn Sie Base64 verwenden wollen ein Cookie zum Speichern von Daten in, müssen Sie a modified Base64 implementation verwenden. Siehe this answer aus dem Grund.

+1

An erster Stelle, warum müssen Sie es kodieren? Sind Sie an einen ASCII-Kanal gebunden? –

+3

Base64 gewinnt, weil es so üblich ist, dass ich mir keine Sorgen machen muss, meinen eigenen Encoder/Decoder zu rollen. Ich habe keine Anwendungen kennengelernt, bei denen ich mir Sorgen darüber gemacht habe, Bandbreite oder Dateibereich in verschlüsselten Binärdaten zu speichern. – jball

+1

@Paul, ich werde gehen wie @jball vorgeschlagen und Base64 auswählen; Da Sie jedoch Daten an den Client senden und erwarten, dass _same_ Daten zurückkommen, sollten Sie sich bewusst sein, dass auf der Clientseite manipuliert werden kann. –

Antwort

13

Für die Codierung von Cookie-Werten müssen Sie vorsichtig sein. Sehen Sie diese older answer:

Mit Version 0 Cookies sollten Werte nicht Leerzeichen enthalten, Klammern, Klammern, Gleichheitszeichen, Kommas, doppelte Anführungszeichen, Schrägstriche, Marken in Frage, bei Zeichen, Doppelpunkte, und Semikolons. Leere Werte dürfen sich nicht in allen Browsern gleich verhalten.

Base64-Codierung = Symbole für bestimmte Eingaben erzeugen kann, und dies ist technisch nicht in Cookies (Version 0 Cookies, wie auch immer, die die am weitesten unterstützt sind) zulässig.In der Praxis vermute ich, dass die = tatsächlich gut funktioniert, aber vielleicht nicht.

Ich würde vorschlagen, um absolut sicher zu sein, dass Ihre codierte Binärdatei Cookie-kompatibel ist, dann grundlegende Hex-Codierung ist am sichersten (z. B. in java).

edit: Wie @ Paul helfend darauf hingewiesen, gibt es eine modified version of Base 64, die "URL sicher" ist (und ich nehme an, "Cookie sicher"). Die Verwendung einer modifizierten Version eines Standardalgorithmus verwässert eher seinen Charme, wohlgemerkt.

bearbeiten: @shoosh wies darauf hin, dass die = nur das Ende der Base64-String bezeichnen ist, so könnte man die = trimmen, setzen Sie das Cookie, dann die = wieder wieder anbringen, wenn Sie es entschlüsseln müssen.

+0

+1, nette Warnung über '=' character, ty –

+1

In base64 '=' wird nur zum Auffüllen der letzten Bytes verwendet. Sie können entweder sicherstellen, dass sie nicht emittiert werden, oder sie einfach in etwas anderes ändern (und dann wieder zurück). – shoosh

+1

Sie könnten in Erwägung ziehen, Ihre Antwort zu aktualisieren, um auf http://en.wikipedia.org/wiki/Base64#URL% zu verweisen. 5Fapplications - eine Version von Base4 speziell für die Verwendung in der HTTP-Umgebung. –

2

Es war einmal UTF-7. Es ist offiziell veraltet, aber es funktioniert immer noch als ACE (ASCII Compatible Encoding). Jetzt gibt es IDN.

+0

+1 für den Hinweis auf IDN und UTF-7 als alternative Formen, Unicode zu ASCII-sicheren Transporten zu machen. –

1

Base64 ist der de-facto-Standard. Mit etwas anderem wird nach Ärger gefragt.

+0

+1 für den Hinweis auf Uuencode. –

+0

'Uuencoding' bringt mich zurück zu den Usenet-Tagen 1992 :) Tatsächlich wurde' Uuencoding' in der Usenet-Nutzung von 'yenc' (http://www.yenc.org/) weitgehend verdrängt. – skaffman

+1

Yenc. Blimey, das bringt dich zurück ... dann fängst du an, über xmodem/ymodem und zmodem nachzudenken, um es vom Shell-Server auf deinen Heimcomputer zu bekommen ;-) –

4

Base64 gewinnt, weil es so üblich ist, dass ich mir keine Sorgen machen muss, meinen eigenen Encoder/Decoder zu rollen. Ich habe keine Anwendungen kennengelernt, bei denen ich mir Sorgen darüber gemacht habe, Bandbreite oder Dateibereich in verschlüsselten Binärdaten zu speichern.

+0

upvoted, da du der Erste bist, der das gesagt hat, in den Kommentaren zu der Frage. –

+0

+1, hier gehts, jball =) –