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.