TL;DR
- Si sus datos son un mensaje largo o tienen al menos 72 bits de entropía, use SHA-256 .
- Si sus datos son una contraseña, utilice BCrypt , ajustando el factor de trabajo en unos 100 ms.
- Si los datos de entrada tienen muy poca entropía, el hash (incluso con BCrypt) no proporcionará una seguridad significativa.
- debilidad
password
s
- PIN de todos los dígitos
- números de cuentas bancarias
Si bien es difícil enumerar todas las rutinas hash, es fácil enumerar las rutinas más comunes, y aún más fácil recomendar la que debería usar.
La familia de hash SHA-2 (SHA-256 a SHA-512) se consideran rutinas de hash de propósito general sólidas. SHA-256 funciona mejor para la mayoría de los propósitos.
MD5 es bastante débil y SHA-1 es aceptable. Mientras que algunas personas pueden desear que MD5 sea más corto (128 bits en lugar de 256), en realidad es mejor truncar un hash moderno. Obviamente, es mejor utilizar la longitud total de hash de 256 bits.
Recuerde, las rutinas hash de propósito general como MD / SHA están diseñadas para ser rápidas . Para la mayoría de los programas de computadora, rápido se considera bueno.
Sin embargo, si el valor de entrada original tiene una entropía limitada (por ejemplo, un pin de 4 dígitos), será muy fácil realizar una fuerza bruta (pruebe los 10,000 valores de entrada posibles y compárelos con ) el hash, determinando así los datos secretos.
- PIN de 4 dígitos = 13 bits de entropía (no se puede hacer lo suficientemente seguro con hash)
- Cadena hexagonal verdaderamente aleatoria de 18 caracteres = entropía de 72 bits
- Cadena Base64 de 12 caracteres verdaderamente aleatoria = entropía de 72 bits
- 8 caracteres
password
de un usuario perezoso = casi sin entropía
- contraseña de 11 caracteres con algunos trucos de sustitución comunes
Tr0ub4dor&3
= aproximadamente 28 bits de entropía
- número de tarjeta de crédito = no hay suficiente entropía, así que no almacene ni su hash
- mensaje de correo electrónico o cualquier archivo de texto grande = mucha entropía
Cada bit de entropía significa que la fuerza bruta de estos datos lleva el doble de tiempo.
El tiempo que lleva la fuerza bruta depende de la velocidad del hardware del atacante y de la velocidad del hash. Entonces,
-
Si sus datos de entrada tienen 72 bits de entropía o más, simplemente use SHA-256.
-
Si sus datos de entrada tienen menos entropía o entropía no confiable (contraseñas proporcionadas por el usuario), debe usar un Slow Hash .
Las rutinas de hash lento son ajustables, por lo que en lugar de completar la operación de hash en unos pocos microsegundos, toma varios milisegundos (recomiendo unos 100 ms) en su hardware de producción. (tenga en cuenta que el hardware del atacante probablemente sea mucho más rápido)
Aquí hay algunas buenas opciones de Slow Hash.
Cada uno tiene un medio para ajustar el tiempo de procesamiento. (fuerza del hash)
-
Repite tu hash SHA-256 (o SHA-512) muchas veces.
Esto es sencillo de implementar y se considera una técnica razonable. (a pesar de que SHA fue diseñado para ser rápido)
-
BCrypt (hash lento comúnmente recomendado)
-
SCrypt (más nuevo (menos probado), diseñado para ser resistente a GPU debido a los requisitos de RAM)
-
PBKDF2 (antigua, buena alternativa a BCrypt)
Nota: la optimización de su función hash es importante. Use la versión nativa compilada de BCrypt, no una "escrita en" un lenguaje de alto nivel (es decir, JBCrypt se escribió en Java), ya que la versión compilada de forma nativa (escrita en C / C ++, con vínculos adecuados a su lenguaje de alto nivel) sea más eficiente, por lo que le permite calcular un factor de trabajo más alto (más fuerte) en la misma cantidad de tiempo.
Es común agregar sal a un hash. Esto es único, pero no secreto, y se agrega a la contraseña antes de que se genere el hash. De esta manera, si un atacante roba su base de datos y ejecuta la fuerza bruta en todos los hashes, tendrá que ejecutar una copia bruta por trabajo para cada Sal utilizada, lo que le llevará un poco más de tiempo que todas las contraseñas. en un solo trabajo.