Pregunta

Esta pregunta ya tiene respuesta aquí:

Está ahí cualquier cosa disponible que no sea trivialmente rompible?

¿Fue útil?

Solución

Esta respuesta de 2008 está ahora peligrosamente desactualizada. SHA (todas las variantes) ahora es trivialmente rompible, y la mejor práctica ahora (a partir de enero de 2013) es usar un hash de extensión de clave (como PBKDF2) o, idealmente, uno con uso intensivo de RAM (como Cripta) y agregar también una sal por usuario.

Todavía merece la pena prestar atención a los puntos 2, 3 y 4.

Ver el Sitio de seguridad de TI SE para más.


Respuesta original de 2008:

  1. Utilice 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 probado 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 se limite a codificar la contraseña, sino que también incluya otra información.A menudo utilizas el hash de "nombre de usuario:contraseña:sal" o similar, en lugar de solo la contraseña, pero si juegas con esto, será 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 de GeorgeBush:Rep4Lyfe:ASOIJNTY es xyz"

Otros consejos

La primera regla de la criptografía y el almacenamiento de contraseñas es "no lo inventes tu mismo,", pero si es necesario, aquí está el mínimo absoluto que debe hacer para tener alguna apariencia de seguridad:

Reglas cardinales:

  1. Nunca almacene una contraseña de texto sin formato (lo que significa que tampoco podrá mostrarla ni 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 hash).
  3. La velocidad es tu enemigo.
  4. Reanalizar periódicamente y mejora tu proceso a medida que mejoran el hardware y el criptoanálisis.
  5. La criptografía y el proceso son una muy pequeña parte 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. Cambie las contraseñas con frecuencia.
  3. Utilice el hachís más fuerte que pueda conseguir. SHA-256 fue sugerido aquí.
  4. Combina la contraseña con un sal fija (Lo mismo para toda su base de datos).
  5. Combina el resultado del paso anterior con un sal única (tal vez el nombre de usuario, la identificación del registro, un guid, un número aleatorio largo, etc.) que se almacena y adjunta a este registro.
  6. Ejecute el algoritmo hash varias veces. como 1000+ veces.Lo ideal es incluir una sal diferente cada vez con el picadillo anterior.La velocidad es tu enemigo y múltiples iteraciones reducen la velocidad.De vez en cuando, duplique 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 o alguna otra línea de seguridad, no permita que su contraseña se transmita en texto sin formato.Y si solo está comparando el hash final del cliente con su hash almacenado, tampoco permita que se transmita en texto sin formato.Debe enviar un nonce (número usado una vez) al cliente y hacer que lo haga con su hash generado (usando los pasos anteriores) y luego le enviarán ese.En el lado del servidor, ejecuta el mismo proceso y ve si los dos hash únicos coinciden.Luego deshazte de ellos.Hay una manera mejor, pero esa es la más sencilla.

CodingHorror tuvo un gran artículo sobre esto el año pasado.

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

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

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

Sin embargo, existen algoritmos creados específicamente para derivar claves a partir de contraseñas.Estos son los funciones de derivación clave.Están diseñados para usarse con cifrados simétricos, pero también son buenos para almacenar contraseñas. PBKDF2 por ejemplo, utiliza sal, una gran cantidad de iteraciones y una buena función hash.Si tiene una biblioteca, ¿qué la implementa (p. ej..NET), creo que deberías considerarlo.

Agrega un sal única al valor de la contraseña hash (almacene el valor salt en la base de datos).Cuando un se utiliza sal única el beneficio de usar un algoritmo más seguro que SHA1 o MD5 no es realmente necesario (en ese momento es una mejora incremental, mientras que usar salt es una mejora monumental).

Utilice una función hash criptográfica sólida como MD5 o SHA1, pero asegúrese de utilizar una buena sal, de lo contrario serás susceptible a mesa arcoiris ataques.

Actualización de enero de 2013

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

Ahora es imprescindible una sal larga, al igual que algo más duro como SHA512.

Sin embargo, todos los hashes variantes de SHA están diseñados para el cifrado de comunicaciones: mensajes de ida y vuelta donde cada mensaje está cifrado y, por esta razón, están diseñados para ser rápido.

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

Un hash rápido como SHA512 se puede generar millones, incluso miles de millones de veces por segundo.Agregue un procesamiento paralelo económico y cualquier permutación posible de una contraseña se convierte en una necesidad absoluta.

El estiramiento de teclas es una forma de combatir esto.Un algoritmo de estiramiento de claves (como PBKDF2) aplica un hash más rápido (como SHA512) miles de veces, lo que normalmente hace que la generación del hash demore aproximadamente 1/5 de segundo.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 debería haber siempre ser una sal aleatoria por usuario.Esto se puede generar aleatoriamente como el primero. norte bytes del hash (que luego se eliminan y se agregan al texto de la contraseña que se verificará antes de crear los hash para comparar) o como una columna de base de datos adicional.

Entonces:

¿Qué algoritmo debo utilizar para codificar contraseñas en mi base de datos?

  • Estiramiento de teclas para ralentizar la generación de hash.Probablemente elegiría PBKDF2.

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

La potencia y la disponibilidad de las computadoras están aumentando exponencialmente; es probable que estas reglas vuelvan a cambiar dentro de otros 4 años.Si necesita seguridad preparada para el futuro, investigaría los hashes de estilo bcrypt/scrypt: estos toman los algoritmos de extensión de claves más lentos y agregan un paso que usa mucha RAM para generar el hash.Usar tanta RAM reduce la efectividad de los procesadores paralelos baratos.

Original de septiembre de 2008 (dejado para que los comentarios tengan sentido)

MD5+sal o SHA1+sal no es 'trivialmente rompible': la mayoría de los trucos dependen de enormes tablas de arcoíris y se vuelven menos útiles con una sal [update, now they are].

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

SHA2 llega hasta 512: será bastante imposible 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 que puede hacerlo [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 hash simples no deben usarse aquí. Esta es la razón por la cual:

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

así que usa 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".Aquí es simplemente donde el atacante tiene un diccionario muy grande de posibles contraseñas y las codifica todas.Luego ven si alguno de esos hash coincide con el hash de la contraseña que quieren descifrar.Esta técnica puede probar fácilmente millones de contraseñas.Por eso es necesario 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 no supone una mejora significativa.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top