2015-06-05 15 views
5

Ich habe einen Webservice erstellt, der nach einer erfolgreichen Authentifizierung einen Sicherheits-Token zurückgibt.Warum SHA256 Hashes mit "=" enden?

jedoch beim Debuggen bemerkte ich, dass jeder Hash der Webservice zurück endet mit „=“ wie:

"tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc=" 
"INv7q72C1HvIixY1qmt5tNASFBEc0PnXRSb780Y5aeI=" 
"QkM8Kog8TtCczysDmKu6ZOjwwYlcR2biiUzxkb3uBio=" 
"6eNuCU6RBkwKMmVV6Mhm0Q0ehJ8Qo5SqcGm3LIl62uQ=" 
"dAPKN8aHl5tgKpmx9vNoYvXfAdF+76G4S+L+ep+TzU=" 
"O5qQNLEjmmgCIB0TOsNOPCHiquq8ALbHHLcWvWhMuI=" 
"N9ERYp+i7yhEblAjaKaS3qf9uvMja0odC7ERYllHCI=" 
"wsBTpxyNLVLbJEbMttFdSfOwv6W9rXba4GGodVVxgo=" 
"sr+nF83THUjYcjzRVQbnDFUQVTkuZOZYe3D3bmF1D8=" 
"9EosvgyYOG5a136S54HVmmebwiBJJ8a3qGVWD878j5k=" 
"8ORZmAXZ4dlWeaMOsyxAFphwKh9SeimwBzf8eYqTis=" 
"gVepn2Up5rjVplJUvDHtgIeaBL+X6TPzm2j9O2JTDFI=" 

Warum ein solches Verhalten?

+2

Der SHA-Schlüssel ist eine ganze Zahl, hier ist dies wahrscheinlich eine [base64] (https://en.wikipedia.org/wiki/Base64) Codierung des Schlüssels. Da der Schlüssel 256 Bits breit ist oder 32 Bytes, wird er als ungefähr 4/3 * 32 ~ = 43 Zeichen codiert. –

+0

Warum sind sie nur 44 Zeichen lang? Auf welcher Basis codieren Sie sie? – pzp

+0

@pzp Die Antwort ist gleich oben. –

Antwort

11

Dies liegt daran, dass Sie das rohe Bytes der Hash nicht sehen, sondern die Base64-Codierung.

Base64-Codierung konvertiert einen Block von 3 Bytes in einen Block mit vier Zeichen. Das funktioniert gut, wenn die Anzahl von Bytes, die von 3. teilbar ist, wenn dies nicht der Fall, dann sind Sie ein padding-Zeichen verwenden, so dass die Anzahl der resultierenden Zeichen noch teilbar ist durch 4.

So:

(no of bytes)%3 = 0 => no padding needed 
(no of bytes)%3 = 1 => pad with == 
(no of bytes)%3 = 2 => pad with = 

Ein SHA256-Hash ist 256 Bit, das sind 32 Byte. So erhalten Sie 40 Zeichen für die ersten 30 Bytes, 3 Zeichen für die letzten 2 Bytes und das Padding wird immer eins sein =.

+0

Ich stimme natürlich der Antwort zu, aber ich kann nicht erklären, warum die Strings in der Frage nicht alle gleich lang sind. Vielleicht ein Fehler des OP? –

4

Diese Zeichenfolgen werden codiert, indem base64, = Zeichen als Padding verwendet werden, damit der letzte Block einer Base64-Zeichenfolge vier Zeichen enthält.


Der folgende Ruby-Code verwendet werden könnte, Base64 decodierte String zu erhalten:

require 'base64' 

s = "tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc=" 
puts Base64.decode64(s).bytes.map{|e| '%02x' % e}.join 

Ausgang: b48347d09c66af2bc1ea94641228b588160fec545e743a8812cd0fa5bc3cde87