2015-11-10 10 views
9

Ho due domande che non capisco. Per favore aiutami a dare un'occhiata. Grazie.Funzione MessageDigest.isEqual utilizzata in Java

  1. Qual è l'uso della funzione MessageDigest.isEqual in Java?

  2. Spiegare perché, in alcune versioni precedenti all'aggiornamento 17 di Java SE 6, era vulnerabile a un attacco di temporizzazione.

risposta

7

Guardando una Java SE 6 Update 10 implementazione, vediamo:

public static boolean isEqual(byte digesta[], byte digestb[]) { 

    if (digesta.length != digestb.length) 
     return false; 

    for (int i = 0; i < digesta.length; i++) { 
     if (digesta[i] != digestb[i]) { 
      return false; 
     } 
    } 
    return true; 
} 

Mentre dopo la correzione vediamo:

public static boolean isEqual(byte[] digesta, byte[] digestb) { 
    if (digesta.length != digestb.length) { 
     return false; 
    } 

    int result = 0; 
    // time-constant comparison 
    for (int i = 0; i < digesta.length; i++) { 
     result |= digesta[i]^digestb[i]; 
    } 
    return result == 0; 
} 

La vecchia implementazione sembra essere più efficiente, dal momento che restituisce false quando viene trovato il primo byte non uguale, ma presumo che sia stato sostituito perché potrebbe consentire al chiamante di verificare quanto due array di byte di input sono tra loro in base al tempo di esecuzione del metodo.

La nuova implementazione ha sempre la stessa durata (per gli stessi array di lunghezze), poiché itera su tutti gli array (anche se gli array si differenziano per il loro primo byte).

Ho cercato dove viene chiamato questo metodo. Un esempio è engineVerify(byte[] signature) nella classe com.sun.org.apache.xml.internal.security.algorithms.implementations.IntegrityHmac, che verifica se la matrice di byte della firma passata è valida confrontandola con un array di byte interno. Prima della correzione, misurando il tempo di esecuzione di quel metodo, si poteva provare a generare un array di byte che avrebbe superato il confronto (più lungo il metodo impiegato per eseguire implica che un prefisso più grande dei due array è uguale).

2

consultare il link pagina web come di seguito: http://codahale.com/a-lesson-in-timing-attacks/

posso scegliere quale messaggio che voglio essere autenticato-diciamo un cookie di sessione con un utente specifico ID e quindi calcolare 256 valori possibili:

0000000000000000000000000000000000000000 
0100000000000000000000000000000000000000 
0200000000000000000000000000000000000000 
... snip 250 ... 
FD00000000000000000000000000000000000000 
FE00000000000000000000000000000000000000 
FF00000000000000000000000000000000000000 

I passare attraverso ciascuno di questi valori fino a trovare one-A100000000000000000000000000000000000000 che prende una frazione di un millisecondo più lungo degli altri. Ora so che il primo byte di ciò che dovrebbe essere l'HMAC per quel messaggio è A1. Ripeti il ​​processo per i restanti 19 byte e all'improvviso sono connesso come te.

Problemi correlati