2015-06-05 22 views
5

Ho creato un servizio Web che restituisce un token di sicurezza dopo un'autenticazione corretta.Perché gli hash SHA256 terminano con "="?

Tuttavia quando il debug ho notato che ogni hashing del webservice restituito finiture con "=" quali:

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

Perché un tale comportamento?

+2

La chiave SHA è un numero intero, qui questa è probabilmente una codifica [base64] (https://en.wikipedia.org/wiki/Base64) della chiave. Poiché la chiave è larga 256 bit, o 32 byte, sarà codificata come circa 4/3 * 32 ~ = 43 caratteri. –

+0

Perché sono lunghi solo 44 caratteri? In che base stai codificandoli? – pzp

+0

@pzp La risposta è appena sopra. –

risposta

11

Questo è perché non vedi i byte grezzi del hash, ma piuttosto la codifica Base64.

Base64-encoding converte un blocco di 3 byte in un blocco di quattro caratteri. Questo metodo funziona bene se il numero di byte è divisibile per 3. Se non lo è, allora si utilizza un padding-personaggio così il numero di caratteri risultante è ancora divisibile per 4.

Quindi:

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

Un hash SHA256 è 256 bit, ovvero 32 byte. Quindi otterrai 40 caratteri per i primi 30 byte, 3 caratteri per gli ultimi 2 byte e il riempimento sarà sempre uno =.

+0

Sono d'accordo con la risposta, ovviamente, ma non posso spiegare perché le stringhe nella domanda non siano tutte della stessa lunghezza. Forse un errore dell'OP? –

4

Queste stringhe sono codificate utilizzando base64, = caratteri come paddings, per fare in modo che l'ultimo blocco di una stringa base64 contenga quattro caratteri.


Il seguente codice Ruby potrebbe essere utilizzato per ottenere base64 decodificati stringa:

require 'base64' 

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

uscita: b48347d09c66af2bc1ea94641228b588160fec545e743a8812cd0fa5bc3cde87