¿Por qué usar PBKDF2 en múltiples iteraciones de otra función hash criptográfica?

3

La gente a menudo recomienda PBKDF2 sobre el uso de funciones hash directamente, pero generalmente comparan PBKDF2 con un solo hash sin sal. ¿Qué ventajas hay para usar PBKDF2 en múltiples iteraciones de una función criptográfica con la contraseña y el sal agregados al hash anterior en cada iteración?

Pseudo-código:

password="mypass0rd";
salt=random();
hash = password;
for (int i=0;i<1000;i++){
    hash = sha512(hash+password+salt);
}
    
pregunta gluefan 21.03.2014 - 20:13
fuente

2 respuestas

5
  1. No hagas rodar tu propia criptografía. En general, si está llamando directamente (en lugar de especificar el nombre de) algo de criptografía primitiva (SHA-512, AES, etc.), está violando esta regla. Si crees que los errores de implementación de criptografía no son difíciles de evitar, te sugiero que pruebes Crypto Challenge de Matasano . / li>
  2. Menos líneas de código su . Esto significa menos posibilidades de que arruines algo. También significa un código más limpio y más fácil de mantener.
  3. cuenta iterativa configurable. Seguro que podrías cambiar la variable de iteración en tu código, pero ¿qué pasa con todos los hashes que ya tienes por ahí? Una biblioteca que implementa PBKDF2 tendrá una forma integrada de almacenar y recuperar el recuento de iteraciones para cada hash.
  4. Evita los errores de RNG. Su código realiza una llamada a random() , pero la mayoría de los PRNG incorporados en los idiomas no son seguros para el cifrado. Obtenga una biblioteca que haga la generación de sal por usted, y evite la molestia adicional y los posibles errores.
  5. Portabilidad. ¿Necesitas actualizar o cambiar tu backend? Probablemente solo puede copiar (exportar / importar bases de datos) los registros de sus usuarios y los hashes antiguos en el nuevo marco. De lo contrario, tiene que volver a escribir su algoritmo de hash personalizado para el nuevo marco, ejecutando las diferencias de implementación:
    • ¿La salida de sha512 de bytes sin formato o hexadecimal?
    • ¿Qué codificación de caracteres usaste para las contraseñas?
    • ¿Es salt una cadena o un número, y cómo se convierte en bytes para la entrada en sha512 ?
respondido por el bonsaiviking 21.03.2014 - 22:24
fuente
1

Una diferencia importante entre su construcción y PBKDF2 es que PBKDF2 usa una función pseudoaleatoria (prf), típicamente HMAC, en lugar de un hash directamente. SHA1 y SHA2 son no prfs, por lo que ciertas pruebas de seguridad no se aplican a ellos.

Un problema teórico con tu construcción es que puedes golpear colisiones internas o cadenas cortas. Debido a que su salt y contraseña permanecen en cada iteración, si alguna vez produce el mismo hash dos veces a medida que avanza, terminará en un ciclo de hashes. (PBKDF2 también tiene una variante de esto, pero ilustra el tipo de cosas a tener en cuenta).

Por lo tanto, lo harías mejor si tu bucle se vea como

hash = hmac-sha512(i + salt + password, hash)

pero por todas las razones que otros han señalado, aún está mejor utilizando PBKDF2, verrugas y todo, en lugar de rodar el suyo propio.

PBKDF2 alternativas

scryp t es superior a PBKDF2 en casi todas las situaciones. Pero es más difícil aprender a usar correctamente. PBKDF2 es superior a bcrypt.

También se debe tener en cuenta que PBKDF2 se diseñó para la obtención de claves, no para el hashing de contraseñas. Así que tiene algunas características y características que no son realmente lo que necesitas. (Y tiene un error en ese componente que solo importa para la derivación de claves, y solo en circunstancias muy inusuales).

Por mucho que critique PBKDF2, sigo pensando que es mejor usarlo que rodar el suyo. Los problemas particulares con esto no son algo que se encontrará con el hashing de contraseñas.

Un sucesor de PBKDF2 / scrypt / bcrypt

Es posible que desee seguir los desarrollos de la competencia de hash de contraseña . Este es un intento de encontrar un sucesor adecuado para PBKDF2, scrypt, bcrypt para el hashing de contraseñas. Pero por el momento, solo use scrypt si está disponible para usted o PBKDF2.

    
respondido por el Jeffrey Goldberg 22.03.2014 - 18:31
fuente

Lea otras preguntas en las etiquetas