¿Es correcta esta implementación de PBKDF2?

1

Me estoy preparando para una presentación y solo quiero volver a comprobar que lo hice bien:

PBKDF2 es:

for (0,4096)
{
     data1 = HMACSHA1(data1, data2); 
     data2 = HMACSHA1(data2, data1);
}
where data1 and data2 are pass and respectively salt and
HMACSHA1 = SHA1(salt+SHA1(pass+salt))

¿Esto es correcto?

    
pregunta Zodiac 07.09.2016 - 09:12
fuente

1 respuesta

1

Tu bucle está mal en dos aspectos.

  1. La longitud del DK también es importante
  2. La contraseña se reutiliza

De acuerdo con la wiki (o puede ir a la RFC si lo desea):

  

DK = PBKDF2(PRF, Password, Salt, c, dkLen)

     

donde:

     
  • PRF es una función pseudoaleatoria de dos parámetros con longitud de salida hLen (por ejemplo, un HMAC con clave)
  •   

...

     

Cada bloque hLen-bit Ti de la clave derivada DK, se calcula de la siguiente manera:

     

DK = T1 || T2 || ... || Tdklen/hlen

     

Ti = F(Password, Salt, c, i)

     

F(Password, Salt, c, i) = U1 ^ U2 ^ ... ^ Uc

     

donde:

     

U1 = PRF(Password, Salt || INT_32_BE(i))

     

U2 = PRF(Password, U1)

     

...

     

Uc = PRF(Password, Uc-1)

WPA2 usa un DK de 256 bits ( DK = PBKDF2(HMAC−SHA1, passphrase, ssid, 4096, 256) ), por lo que el proceso necesita dos bloques ( Ti ) para alcanzar esto, ya que SHA1 solo tiene una longitud de 160 bits. Además, la iteración descrita aquí usa la contraseña original para cada iteración, es decir, Ui = PRF(Password, Ui-1) , o está reutilizando la contraseña modificada en cada iteración en su propio bucle.

Para una versión simplificada para WPA2 escribiría:

DK = B1 || trunc(B2)
B1 = F(Password, SSID || INT(1))
B2 = F(Password, SSID || INT(2))

where F(P, S) is the function

for(0, 4096) {
    U = HMAC-SHA1(P, S)
    S = U
}
    
respondido por el M'vy 07.09.2016 - 10:11
fuente

Lea otras preguntas en las etiquetas