¿Qué algoritmo debería usar para hash contraseñas en mi base de datos?

¿Hay algo disponible que no sea trivialmente frágil?

Esta respuesta de 2008 ahora está peligrosamente desactualizada. SHA (todas las variantes) ahora es trivialmente frágil, y la mejor práctica es ahora (a partir de enero de 2013) utilizar un hash de extensión de clave (como PBKDF2) o, idealmente, una RAM intensiva (como Bcrypt ) y agregar una sal por usuario también.

Los puntos 2, 3 y 4 todavía merecen atención.

Visite el sitio de IT Security SE para obtener más información.


Respuesta original de 2008:

  1. Use un algoritmo probado. SHA-256 usa 64 caracteres en la base de datos, pero con un índice en la columna que no es un problema, y ​​es un hash comprobado y más confiable que MD5 y SHA-1. También se implementa en la mayoría de los idiomas como parte del paquete de seguridad estándar. Sin embargo, no te sientas mal si usas SHA-1.

  2. No solo oculte la contraseña, sino que incluya otra información en ella. A menudo usas el hash de “nombre de usuario: contraseña: sal” o similar, en lugar de solo la contraseña, pero si juegas con esto, haces aún más difícil ejecutar un ataque de diccionario.

  3. La seguridad es un campo difícil, no creas que puedes inventar tus propios algoritmos y protocolos.

  4. No escriba registros como “[AddUser] Hash of GeorgeBush: Rep4Lyfe: ASOIJNTY es xyz”

La primera regla de criptografía y almacenamiento de contraseñas es ” no lo invente usted mismo “, pero si debe hacerlo aquí es lo mínimo que debe hacer para tener cualquier apariencia de seguridad:

Reglas cardinales:

  1. Nunca almacene una contraseña de texto sin formato (lo que significa que tampoco puede mostrarla o transmitirla).
  2. Nunca transmita la representación almacenada de una contraseña a través de una línea no segura (ya sea texto sin formato, codificado o codificado).
  3. La velocidad es tu enemigo
  4. Reanalizar y mejorar regularmente su proceso a medida que mejora el hardware y el criptoanálisis.
  5. La criptografía y el proceso es una parte muy pequeña de la solución.
  6. Los puntos de falla incluyen: almacenamiento, cliente, transmisión, procesamiento, usuario, garantías legales, intrusión y administradores.

Pasos:

  1. Haga cumplir algunos requisitos mínimos razonables de contraseña.
  2. Cambiar contraseñas con frecuencia.
  3. Usa el hash más fuerte que puedas obtener: SHA-256 fue sugerido aquí.
  4. Combine la contraseña con una sal fija (la misma para toda su base de datos).
  5. Combine el resultado del paso anterior con una sal única (tal vez el nombre de usuario, ID de registro, un guid, un número aleatorio largo, etc.) que se almacena y se adjunta a este registro.
  6. Ejecute el algoritmo hash varias veces, como más de 1000 veces . Lo ideal es incluir una sal diferente cada vez con el hash anterior. La velocidad es tu enemigo y múltiples iteraciones reducen la velocidad. De vez en cuando duplica las iteraciones (esto requiere capturar un nuevo hash; hágalo la próxima vez que cambien su contraseña).

Ah, y a menos que esté ejecutando SSL u otra seguridad de línea, entonces no permita que su contraseña se transmita en texto sin formato. Y si solo compara el hash final del cliente con el hash almacenado, tampoco permita que se transmita en texto sin formato. Necesitas enviar un nonce (número usado una vez) al cliente y hacer que ellos hagan un hash que con su hash generado (usando los pasos anteriores) hash y luego te lo envían. En el servidor, ejecuta el mismo proceso y ve si los dos hashes de una vez coinciden. Entonces deséchelos. Hay una mejor manera, pero esa es la más simple.

CodingHorror tuvo un excelente artículo sobre este último año

http://www.codinghorror.com/blog/archives/000953.html

La recomendación al final del artículo es BCrypt

Los algoritmos antes mencionados son algoritmos de hash criptográficamente seguros (pero MD5 no se considera seguro en la actualidad).

Sin embargo, existen algoritmos creados específicamente para derivar claves de contraseñas. Estas son las funciones clave de derivación . Están diseñados para su uso con cifras simétricas, pero también sirven para almacenar la contraseña. PBKDF2, por ejemplo, usa sal, gran cantidad de iteraciones y una buena función hash. Si tiene una biblioteca, qué lo implementa (por ejemplo, .NET), creo que debería considerarla.

Agregue una sal única al valor de contraseña hash (almacene el valor de sal en el db). Cuando se utiliza una sal única, la ventaja de usar un algoritmo más seguro que SHA1 o MD5 no es realmente necesaria (en ese momento es una mejora incremental, mientras que el uso de una sal es una mejora monumental).

Use una fuerte función hash criptográfica como MD5 o SHA1, pero asegúrese de utilizar una buena sal , de lo contrario, será susceptible a los ataques de tabla arcoiris .

Actualización ene 2013

La respuesta original es de 2008, y las cosas se han movido un poco en los últimos 5 años. La disponibilidad de la computación en la nube y las potentes tarjetas gráficas de procesador paralelo significa que las contraseñas con hasta 8 o 9 caracteres se clasifican como MD5 o SHA1 ahora son triviales.

Ahora una sal larga es imprescindible, como algo más difícil como SHA512.

Sin embargo, todos los hash de variante SHA están diseñados para el cifrado de comunicación, mensajes hacia adelante y hacia atrás donde cada mensaje está encriptado, y por esta razón están diseñados para ser rápidos .

En el mundo de hash de contraseñas, este diseño es una gran desventaja, ya que cuanto más rápido es el hash, menos tiempo se necesita para generar un gran número de hashes.

Un hash rápido como SHA512 se puede generar millones, incluso miles de millones de veces por segundo. Agregue un parallel processing barato y cada permutación posible de una contraseña se convierte en una necesidad absoluta.

Key-stretching es una forma de combatir esto. Un algoritmo de extensión de clave (como PBKDF2) aplica un hash más rápido (como SHA512) miles de veces, lo que generalmente hace que la generación de hash tome 1/5 de segundo más o menos. Alguien que inicie sesión no se dará cuenta, pero si solo puedes generar 5 hashes por segundo, los ataques de fuerza bruta son mucho más difíciles.

En segundo lugar, siempre debe haber una sal aleatoria por usuario. Esto se puede generar aleatoriamente como los primeros n bytes del hash (que luego se eliminan y se agregan al texto de la contraseña que se va a verificar antes de comstackr los hash para comparar) o como una columna DB adicional.

Asi que:

¿Qué algoritmo debería usar para hash contraseñas en mi base de datos?

  • Key-stretching para frenar la generación de hash. Probablemente vaya con PBKDF2.

  • Sal por usuario significa un nuevo ataque por usuario, y algo de trabajo para descubrir cómo obtener la sal.

El poder de la computación y la disponibilidad aumentan exponencialmente. Es probable que estas reglas cambien nuevamente en otros 4 años. Si necesita seguridad a prueba de futuro, investigaría los hashes de estilo bcrypt / scrypt; estos toman los algoritmos de estiramiento de tecla más lentos y agrega un paso que usa mucha RAM para generar el hash. El uso de tanta RAM reduce la efectividad de los procesadores paralelos baratos.

Original de septiembre de 2008 (dejado en lo que los comentarios tienen sentido)

La sal MD5 + o la sal SHA1 + no es “trivialmente frágil”: la mayoría de los piratas informáticos dependen de enormes tablas de arcoíris y éstas se vuelven menos útiles con una sal [update, now they are] .

La sal MD5 + es una opción relativamente débil, pero no se romperá fácilmente [update, now it is very easy to break] .

SHA2 sube hasta 512 – eso será bastante difícil de descifrar con el kit disponible [update, pretty easy up to 9 char passwords now] , aunque estoy seguro de que hay un Cray en algún búnker militar en algún lugar que puede hacer it [You can now rent this 'Cray' from Amazon]

MD5 o SHA en combinación con un valor de sal generado aleatoriamente para cada entrada

como se mencionó anteriormente, los algoritmos de hashing simples no deberían usarse aquí, razón por la cual:

http://arstechnica.com/security/2012/08/passwords-under-assault/

entonces use algo más como http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

Todos los algoritmos hash son vulnerables a un “ataque de diccionario”. Esto es simplemente donde el atacante tiene un diccionario muy grande de contraseñas posibles, y las clasifica a todas. A continuación, verán si alguno de esos hashes coincide con el hash de la contraseña que desean descifrar. Esta técnica puede probar fácilmente millones de contraseñas. Es por eso que debe evitar cualquier contraseña que pueda ser remotamente predecible.

Pero, si está dispuesto a aceptar la amenaza de un ataque de diccionario, MD5 y SHA1 serían más que adecuados. SHA1 es más seguro, pero para la mayoría de las aplicaciones esto realmente no es una mejora significativa.

Los hashes MD5 / SHA1 son buenas opciones. MD5 es ligeramente más débil que SHA1.