SHA-1 e codifica Base64
La funzione di hash SHA-1 permette di avere in output un array di byte di dimensione fissa pari a 20. Ricordo che SHA-1 è una funzione di hash a 160 bit con un livello di sicurezza di 80 bit, ben al di sotto di un ipotetico margine di sicurezza posto a 128 bit come da standard. Basterebbero 2^80 operazioni per risalire al messaggio (attacco del compleanno…ma non è cosi semplice). In questo post mostro come la codifica Base64 amplifica il messaggio da 20 a 28 byte.
String testString = "abcdefghilmnopqrst99";
System.out.println("testString.length() = " + testString.length());
byte[] testBase64 = Base64.encodeBase64(testString.getBytes());
for (int i = 0; i < testBase64.length; i++) {
System.out.println("testBase64[" + i + "] = " + testBase64[i] +
+ "; char-->" + (char)testBase64[i]);
}
System.out.println("testBase64.length = " + testBase64.length);
Come sappiamo Base64 codifica i byte in gruppi di 6 bit e aggiunge se necessario il simbolo ‘=’ per ogni coppia di bit necessaria al padding.
20 byte * 8 = 160 bit
160 bit / 6 bit = 26 simboli (per difetto)
26 simboli + 6 bit = 156 bit avanzano 4 bit => 2 bit padding
Quindi avrò 156 + 4 +2 = 162 bit per la codifica in Base64
162 bit / 6 bit = 27 simboli + 1 simbolo per il padding = 28 simboli
Ma un simbolo Base64 non è altro che un carattere ASCII, quindi 28 simboli = 28 byte.
Infatti se osserviamo l’output del codice sopra esposto vediamo che gli utlimi due caratteri (simboli) sono ‘k=’; questo perché 9 = 00001001 ma abbiamo visto che avanzano 4 bit quindi vanno aggiunti a 1001 due bit 00 (1 coppia di bit per il padding implica aggiungere un solo simbolo ‘=’ alla fine dell’ array) per arrivare a 6 bit. In Base64 100100=’k’.