¿Cómo aplicar un pimiento correctamente a bcrypt?

33
  

Actualización: hay una mejor manera de agregar una clave del lado del servidor, que usarla como un pimiento. Con un pimiento, un atacante debe obtener privilegios adicionales en el servidor para obtener la clave. La misma ventaja que obtenemos al calcular el hash primero y luego al cifrar el hash con la clave del lado del servidor (cifrado de dos vías). Esto nos da la opción de intercambiar la clave siempre que sea necesario.

Para las contraseñas de hash en una base de datos, me gustaría agregar un pimiento a la función de hash. Por supuesto, esta pimienta será adicional a la sal única.

La razón por la que quiero agregar un pepper es que evita un ataque de diccionario, en caso de que el atacante solo tenga acceso a la base de datos, pero no al servidor (típico de Sql-Injection). En mi opinión, esto es mejor que un hachís sin pimienta, incluso si la pimienta solo está codificada (para evitar la complejidad del código).

Ahora me pregunto, ¿cómo se debe aplicar correctamente el pimiento, es correcto simplemente agregar el pimiento a la contraseña antes de aplicar hash?

1. Concatenando contraseña y pimienta

$passwordHash = bcrypt($password . $pepper, $salt);

Una razón contra esto podría ser que las contraseñas más grandes que el límite de bcrypt (55 caracteres) no obtendrán la pimienta, aunque las contraseñas de esta longitud probablemente no estén en un diccionario de todos modos. Debido a este límite, el pimiento se agrega después de la contraseña y no antes. Otra razón podría ser que si el atacante conoce el pimiento, también conoce el final de todas nuestras contraseñas salpicadas.

2. Combina contraseña y pimienta con hash

$passwordHash = bcrypt(hash('sha256', $password . $pepper), $salt);

Entonces podríamos usar una función de hash para combinar la contraseña y la pimienta, antes de hash. ¿Es apropiado usar sha256, o qué función hash sería ideal, cuando queramos usar bcrypt después?

3. Combina contraseña y pimienta con hmac

$passwordHash = bcrypt(hash_hmac('sha256', $password, $pepper), $salt);

A menudo, hmac es la solución recomendada, ¿hay alguna ventaja sobre el uso de SHA256 directamente? Ya que solo queremos combinar contraseña y pimienta, y la seguridad proviene más tarde de bcrypt, no puedo ver ninguna ventaja aparente.

Cualquier consejo útil es muy apreciado.

    
pregunta martinstoeckli 07.10.2012 - 22:47
fuente

1 respuesta

24

Sus tres métodos son correctos. El tercero (con HMAC) podría ser un poco más "elegante", matemáticamente hablando: haría más fácil probar la seguridad de la construcción, en comparación con las de bcrypt y HMAC.

Tenga cuidado, sin embargo, de bytes nulos. Una implementación bcrypt dada puede esperar una cadena de caracteres y detenerse en el primer byte del valor 0, que puede ocurrir en la salida de SHA-256 o HMAC (o como parte de la clave binaria que usa como pimienta), ignorando todos los bytes subsiguientes. Sería un grave problema, y usted no lo notaría. Para evitar ese problema, es posible que desee codificar en Base64 la salida de SHA-256 o HMAC antes de entregarla a bcrypt (la salida de SHA-256 codificada en Base64 es de 44 caracteres, aún por debajo del límite de bcrypt).

    
respondido por el Thomas Pornin 07.10.2012 - 23:00
fuente

Lea otras preguntas en las etiquetas