2010-11-25 12 views
11

Wenn ich eine 32-Zeichen-Zeichenfolge (ein MD5-Hash) habe und codiere ich es mit Base64, was ist die maximale Länge der codierten Zeichenfolge?MD5 Hash- und Base64-Codierung

+5

Wenn Sie eine Zeichenfolge mit 32 Zeichen haben, die ein MD5-Hash ist, dann ist es bereits hexadezimiert und es ist nicht notwendig, es zu kodieren. –

+1

Ein MD5-Hash ist nicht hexadezimal! Es ist 16 Bytes - hexadezimal ist einfach eine konventionelle Darstellung. –

+2

@GregS, Sie sind richtig, dass ein MD5-Hash in der Regel in hexadezimaler Form dargestellt werden, die eine Teilmenge von Base64 ist. Aber es gibt einen Zweck, um zu Base64 zu konvertieren - Base64 braucht weniger Zeichen, weil es einen größeren Zeichensatz hat. Es spart Speicherplatz, wenn Sie im Klartext oder Zeichencodierungsschema speichern, wenn Sie Base64 (22 Zeichen) statt hexadezimal (32 Zeichen) verwenden. –

Antwort

31

Ein MD5-Wert ist immer 22 (nützliche) Zeichen lang in Base64-Notation. Viele Base64-Algorithmen fügen beim Codieren eines MD5-Hashs auch 2 Füllzeichen hinzu, wodurch die Gesamtzahl auf 24 Zeichen erhöht wird. Das Padding fügt keine nützlichen Informationen hinzu und kann verworfen werden. Nur die ersten 22 Zeichen sind wichtig.

Hier ist der Grund:

Ein MD5-Hash ein 128-Bit-Wert ist. Jedes Zeichen in einer Base64-Zeichenfolge enthält 6 Informationsbits, da 64 mögliche Werte für das Zeichen vorhanden sind und 6 Potenzen von 2 benötigt werden, um 64 zu erreichen. Mit 6 Informationsbits in jedem Zeichen haben 21 Zeichen 126 Informationsbits. und 22 Zeichen enthält 132 Bits an Informationen. Da 128 Bits nicht in 21 Zeichen passen, aber in 22 Zeichen passen (mit ein wenig Platz), wird ein 128-Bit-Wert in Base64 immer als 22 Zeichen dargestellt.

Ein Hinweis auf die padding:

ich oben, dass viele Base64-Codierung Algorithmen erwähnt fügen Sie ein paar Zeichen der Polsterung, wenn ein MD5-Wert kodiert. Dies liegt daran, dass Base64 3 Byte Information als 4 Zeichen darstellt. Da MD5 über 16 Bytes an Informationen verfügt, fügen viele Base64-Codierungsalgorithmen "==" hinzu, um anzugeben, dass die Eingabe von 16 Bytes um 2 Bytes kürzer war als das nächste Vielfache von 3, was 18 Bytes wäre. Diese 2 Gleichheitszeichen fügen der Zeichenfolge keinerlei Informationen hinzu und können beim Speichern verworfen werden.

7

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

„Beachten Sie, dass eine Eingabe von n Bytes angegeben, wird der Ausgang (n + 2 - ((n + 2)% 3))/3 * 4 Bytes lang, die konvergent n * 4/3 oder 1.33333n für große n. "

Also wird es ((32 + 2 - (32 + 2)% 3))/3 * 4 = 34 - (34% 3)/3 * 4 = (34 - 1)/3 * 4 = 33/3 * 4 = 44 Zeichen.

Sie könnten es immer in roher Binärform (128 Bits) extrahieren und direkt in die Basis 64 kodieren, was bedeutet, dass 16 Bytes anstelle von 32 konvertiert werden, was 24 Bytes wird, wenn die Basis 64 codiert wird.

+5

Ein MD5 Hash ist 128 Bits, die zu 24 base64 Zeichen kodieren würde. –

+0

Danke Arantor! Perfekte Antwort! –

+0

@ GregS, sorry, ja, ich dachte an SHA1, das ist 160 Bits. – Arantor