Primero se debe anotado que el hashing de contraseñas es un segunda línea de defensa . Almacena en la base de datos de su servidor algún valor que permita la verificación de la contraseña; su primer deber es no permitir que personas externas obtengan una copia de ese valor. Entonces, primero aplique todas las actualizaciones de seguridad para su software; desarrolle el código con mucho cuidado y con una metodología adecuada (por ejemplo, al acceder a la base de datos, use declaraciones preparadas ); y tenga en cuenta sus procedimientos operativos (no deje sus copias de seguridad desatendidas, destruya los discos duros después de la clausura, etc.).
El uso de hashing lento está destinado a dificultar la tarea del atacante en caso de que aún tenga éxito en echar un vistazo a su base de datos. Desafortunadamente, esto también dificulta el procesamiento de las contraseñas, por lo que es una compensación. Con bcrypt, un factor de trabajo de n significa que hay 2 n iteraciones internas; un factor de trabajo de "10" significa que ha realizado ataques de diccionario aproximadamente mil veces menos eficientes (desde 2 10 = 1024). Dependiendo de su perspectiva, esto puede ser excelente o insuficiente, pero aún así no es despreciable.
Para mejorar las cosas, hay varios métodos que deberías considerar:
-
Use un "pimiento", es decir, una clave secreta adicional para todo el servidor; esto convierte el hashing de la contraseña en un MAC . Básicamente, cuando "hash la contraseña" (al registrarse y luego de la verificación), calcula HMAC / SHA-256 sobre la contraseña, codifica la salida de 32 bytes en Base64 (para que se convierta en una buena cadena de caracteres imprimibles), luego use esa cadena como entrada para bcrypt.
Ese proceso mejora la seguridad bajo el supuesto de que el atacante puede obtener una copia de las contraseñas con hash, pero no de todo el servidor (por ejemplo, el atacante podría realizar una inyección de SQL pero no leer los archivos de configuración del servidor). En particular, no almacene la clave en la propia base de datos.
-
Ayuda a los usuarios a elegir contraseñas más seguras. Cuidado con las palabras: dije "ayuda", no "fuerza". En particular, NO intente aplicar "reglas de complejidad de contraseñas" como requerir una combinación de ideogramas en mayúsculas, minúsculas y sumerios. Tales reglas, en la práctica, no fortalecen las contraseñas; simplemente hacen que los usuarios se enojen más. En su lugar, lo bueno sería ofrecer una herramienta generadora que produzca contraseñas de alta entropía pero fáciles de memorizar (consulte esta pregunta para orientación). Es importante que la herramienta sea opcional porque desea que los usuarios cooperen libremente con su estrategia de seguridad; si haces algo obligatorio, entonces se rebelarán y las cosas empeorarán.
-
Descargue el problema en manos de otra persona. Esto significa autenticar a los usuarios a través de algo como OpenID ; El proveedor de OpenID es un sistema externo que maneja la verificación de la contraseña por usted.
Un ejemplo notable es el mismo StackExchange: aunque pueden manejar el registro y la verificación de la contraseña por sí mismos, también le permiten registrarse utilizando su cuenta existente de Google o Facebook, o simplemente cualquier proveedor de OpenID.
-
Compra un servidor más grande y poderoso.