2009-05-06 28 views
18

Un article que me topé aquí en enlaces proporcionados SO a other articles que a su vez proporciona enlaces a evenmorearticles etc.¿Cómo almacenar contraseñas * correctamente *?

Y al final me quedé completamente perplejo - ¿y qué es la mejor manera de almacenar contraseñas en la base de datos? De lo que puedo juntar, debe:

  • Use una sal larga (al menos 128 bits completamente aleatorios), que se almacena en texto plano junto a la contraseña;
  • Usa varias iteraciones de SHA-256 (o incluso un nivel SHA mayor) en la contraseña salada.

Pero ... mientras más leo acerca de la criptografía, más entiendo que realmente no entiendo nada, y que las cosas que había pensado que eran ciertas por años, en realidad están completamente equivocadas. ¿Hay algún experto sobre el tema aquí?

Agregado: Parece que a algunas personas les falta el punto. Repito el último enlace dado arriba. Eso debería aclarar mis preocupaciones.

https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2007/july/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes/

+0

Lo tienes exactamente correcto. No almacene contraseñas: almacene hashes de contraseñas. ¿Cuál es tu verdadera pregunta? ¿Qué parte de la salazón y el hash es confusa? ¿O simplemente no estás contento porque esto es nuevo para ti? ¿Qué consejo contradictorio encontraste? –

+0

es esto para la validación del usuario en su propio programa, o ¿está buscando crear un administrador de contraseñas donde debe devolver la contraseña? – Audioillity

+2

No hay una respuesta "correcta". El nivel de seguridad depende mucho del contexto de la aplicación. Una máquina aislada (no conectada físicamente a una red) puede tener menos hash de contraseñas que una base de datos orientada a la web. Por otra parte, su base de datos nunca debe ser directamente accesible para la red, siempre debe haber una capa de acceso entre el usuario y la base de datos. Y el hash/salazón de contraseñas es inútil si la contraseña se envía a la base de datos/capa de acceso en formato de texto plano. – Skizz

Respuesta

12

lo ha hecho bien. Sólo dos sugerencias:

  1. Si un día SHA1 se vuelve demasiado débil y que desea usar otra cosa, es imposible unhash las contraseñas de edad y un refrito con el nuevo esquema. Por esta razón, sugiero que adjunte a cada contraseña un número de "versión" que le diga qué esquema usó (longitud de sal, qué hash, cuántas veces). Si un día necesita cambiar de SHA a algo más fuerte, puede crear contraseñas de estilo nuevo mientras todavía tiene contraseñas antiguas en la base de datos y aún distinguirlas. La migración de usuarios al nuevo esquema será más fácil.

  2. Las contraseñas aún van de usuario a sistema sin cifrado. Mira SRP si eso es un problema. SRP es tan nuevo que deberías ser un poco paranoico sobre su implementación, pero hasta ahora parece prometedor.

Editar: Resulta que bcrypt se me adelantó en la idea número 1. La información almacenada es (costo, sal, hash), donde el costo es cuántas veces el hash se ha hecho. Parece que bcrypt hizo algo bien. Aumentar la cantidad de veces que hash se puede hacer sin la intervención del usuario.

+1

+1 para la idea de grabar una versión para las contraseñas. Puedo ver que ser útil en el futuro ... – Matt

+1

Eso es realmente una mala idea, ya que innecesariamente complica la solución al dar cuenta de un problema que aún no existe. Violación clásica del principio YAGNI. –

+1

+1 para hacer frente a un problema real. La gran negación de Kiff se refuta fácilmente con ejemplos del problema que se plantea aquí en SO. Como alguien que ha tenido que pedirle a decenas de miles de usuarios que elijan nuevas contraseñas en un corto período de tiempo, me hubiera gustado tener una ruta de migración más fluida. – erickson

0

creo que hay ninguna iteración adicional en la contraseña necesaria, juste asegúrese de que no es una sal y un Complexe uno;) I personnaly uso SHA-1 combina con 2 frases clave de sal.

+0

Erm ... http://www.schneier.com/blog/archives/2005/02/sha1_broken.html – chaos

+1

hashing de 1 paso tiene una vulnerabilidad.Puede enumerar un conjunto muy probable de candidatos que conducen al hash. Múltiples pasadas provocan que las tablas de arcoíris crezcan rápidamente, de ahí el hash 256x. http://en.wikipedia.org/wiki/Rainbow_table –

+0

Uso SHA-512, ya que el espacio (y el tiempo del algoritmo) no es un problema, y ​​hay un papel que muestra colisiones en SHA-1 ... sin embargo, estoy solo paranoico. – MichaelICE

2

En verdad, depende de para qué sirven las contraseñas. Debe guardar todas las contraseñas con cuidado, pero a veces se necesita mucho más cuidado que otras. Como regla general, todas las contraseñas deben ser hash y cada contraseña debe tener una sal única.

Realmente, las sales no necesitan ser tan complejas, incluso las pequeñas pueden causar una verdadera pesadilla para los crackers que intentan ingresar al sistema. Se agregan a una contraseña para evitar el uso de tablas de Rainbow para piratear contraseñas de múltiples cuentas. No agregaría una sola letra del alfabeto a una contraseña y la llamaría sal, pero tampoco es necesario que sea un guid único que esté cifrado en otro lugar de la base de datos.

Una cosa más con respecto a las sales. La clave para hacer que una contraseña + sal funcione cuando hash es la complejidad de la combinación de los dos. Si tiene una contraseña de 12 caracteres y le agrega una sal de 1 carácter, la sal no hace mucho, pero descifrar la contraseña sigue siendo una hazaña monumental. Lo contrario también es cierto.

0

La longitud de la sal en realidad no importa, siempre y cuando sea única para el usuario. El motivo de una sal es que un intento generado en una coincidencia hash solo sea útil para una sola fila de la tabla de usuarios en la base de datos.

+3

Sí importa. Lo que su sal efectivamente está haciendo es aumentar el tamaño de la tabla de arco iris que debe usarse para descifrar sus hashes. Una sal corta no hace mucho de esa manera. (Uno de los principales problemas que están superando las sales es que los usuarios eligen contraseñas cortas). – chaos

+0

Sí importa, pero solo hasta cierto punto. Por cada pizca de sal que agregue, duplica los requisitos de espacio necesarios para un ataque de diccionario (o el atacante tiene que cortar su diccionario a la mitad). Si hay una buena política de selección de contraseñas (longitud mínima, requisito para mayúsculas y minúsculas, dígitos, puntuación), probablemente estarás seguro con las viejas sales de 12 bits. Sin embargo, también podría usar 64 bits y estar seguro en todas partes. Nadie tiene espacio para 10^19 diccionarios, incluso si son muy pequeños. – erickson

0

Dicho simplemente, utilice un algoritmo hash criptográficamente seguro y algo de sal para las contraseñas, que debería ser lo suficientemente bueno para el 99,99% de todos los casos de uso. El enlace débil será el código que verifica la contraseña y la contraseña ingresada.

+0

Siempre que dar una mejor seguridad sea tan complicado como 5 líneas de código más triviales, me gustaría buscar la mejor opción en todos los casos de uso. –

+0

No creo que vayas a obtener eso en "5 líneas de código más triviales" ... pero también leeré las otras respuestas y comentarios aquí, tal vez me demuestren que estoy equivocado. – Lucero

+0

Cinco líneas más de código y una columna de base de datos. – chaos

1

Uso:

  1. almacenamiento de contraseñas Hashed
  2. Una sal de nivel de usuario 128+ poco, al azar, regenerado (es decir,a tomar nuevas sales cuando haces nuevos hashes de contraseñas, no se mantienen persistentemente la misma sal de un usuario determinado)
  3. Un método hash fuerte, computacionalmente caro
  4. metodología que es algo diferente (algoritmo de hash, el número de hash iteraciones que utilice, por lo que ordenan las sales se concatenan en, algo ) tanto de los 'guías de implementación estándar' como estos y de cualquier otra aplicación de almacenamiento de contraseñas que has escrito
+1

128 bits es exagerado. Incluso 64 bits es exagerado, así que eso es lo que uso. Tampoco se necesita una "sal de nivel de sistema" a menos que la "sal de nivel de usuario" sea de alguna manera predecible para un usuario (como usar su nombre). Es más fácil y más seguro solo usar un RNG criptográfico para la sal. – erickson

+0

Overkill? Me gusta exagerar. La sal de nivel de sistema es defensa en profundidad para el caso de que los contenidos de su base de datos se vean comprometidos sin que se vea comprometido su código fuente. Acordó que las sales deberían ser ruido, no información del usuario. – chaos

+0

No lo entiendo Hecho correctamente, el resumen, la sal y el código fuente podrían divulgarse, aún no sería factible que un atacante descubriera la contraseña. Cuando dice que la base de datos podría verse comprometida, ¿qué quiere decir? ¿Qué quieres decir con comprometido? – erickson

Cuestiones relacionadas