2012-04-05 23 views
9

Estoy trabajando en un sistema que ha estado mezclando contraseñas de usuario con MD5 (sin sal). Quiero almacenar las contraseñas de forma más segura con SHA-512 y una sal.¿Usa SHA-512 y salt para hash una contraseña hash MD5?

Si bien esto es bastante fácil de implementar para futuras contraseñas, también me gustaría actualizar las contraseñas hash MD5 existentes, preferiblemente sin forzar a todos los usuarios a cambiar sus contraseñas. Mi idea es usar SHA-512 y una sal apropiada para modificar el hash MD5 existente. También puedo establecer un indicador en la base de datos que indique qué contraseñas fueron heredadas del texto sin formato, y cuáles fueron codificadas a partir de un hash MD5. O podría probar ambos al autenticar usuarios. O incluso simplemente hash nuevas contraseñas con MD5 y luego SHA-512/salt, por lo que pueden tratarse igual que las contraseñas antiguas.

Programáticamente, no creo que esto sea un problema, pero no sé lo suficiente sobre encriptación/hash para saber si estoy comprometiendo la calidad del hash de alguna manera mediante la aplicación de un SHA-512/sal hash a una contraseña que ya tenía MD5 hash. Mi primer instinto es que, en todo caso, sería aún más fuerte, una extensión de tecla muy ligera.

Mi segundo instinto es que realmente no sé de lo que estoy hablando, así que será mejor que me aconseje. ¿Alguna idea?

+0

SHA-512 ofrecerá muy poca mejora sobre MD5 (p. Ej .: 'MD5 (salt + password)' es prácticamente equivalente a 'SHA512 (salt + password)'). Las funciones hash de propósito general como MD5 y la familia SHA ** no se han diseñado para almacenar contraseñas. Usa bcrypt. – NullUserException

+0

Muy cierto. De hecho, tenía la intención de hacer un estiramiento clave, pero no lo dejé claro en mi pregunta. Terminé usando PBKDF2 en lugar de implementar ingenuamente mi propio algoritmo de estiramiento de teclas. –

Respuesta

6

La composición de funciones con primitivas criptográficas es peligrosa y no debe realizarse si es posible evitarla. La solución común para su tipo de problema es mantener ambos valores hash para un período de migración, utilizando el nuevo hash siempre que sea posible y actualizando transparentemente las contraseñas antiguas (cuando comprueba una contraseña y coincide, la rehace con el nuevo algoritmo y la almacena)

Esto no funcionará si tiene un esquema basado en desafío-respuesta en el que no puede ver la contraseña de texto simple, pero como parece que tiene una sal almacenada que no cambia, supongo que su aplicación hace el hashing .

+0

Esta es una gran respuesta. He implementado exactamente este tipo de solución antes y es una excelente manera de hacerlo. – jeffsix

+0

¡Gracias por la sugerencia de volver a configurar de forma transparente cuando el usuario inicie sesión! ¿Tiene algún enlace que explique por qué la aplicación de un hash SHA-512 a un valor de hash MD5 es menos seguro que aplicar un hash SHA-512 a una contraseña de texto sin formato? Me interesa saber por qué ... –

+1

@JeremiahOrr: para su aplicación específica, el uso adecuado de una sal impredecible lo suficientemente larga hará mucho más en términos de seguridad que cambiar el esquema de hash. Como explicó j13r, la aplicación de SHA en MD5 no ampliará el espacio de hashes posibles, ya que están limitados por los posibles resultados de MD5. Además, usar una función unidireccional específicamente optimizada para las contraseñas sería aún mejor, por ejemplo [PBKDF2] (http://en.wikipedia.org/wiki/PBKDF2). – mensi

1

Confíe en su segundo instinto. Use una biblioteca existente hecha especialmente para contraseñas hash en lugar de tratar de cocinar la suya propia.

Probablemente hash sus nuevas contraseñas con MD5 y luego hash el MD5 con su biblioteca de hash de contraseñas. De esta forma, puede mantener la compatibilidad con versiones anteriores de sus contraseñas antiguas.

I.e. password_hash (Todos los viejos, contraseñas md5'd) y password_hash (MD5 (Las nuevas contraseñas))

(Advertencia: No soy un experto en criptografía)

http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

+0

¡Oh, no tengo la intención de cocinar mi propia biblioteca de hashing, solo necesito saber qué hacer con las contraseñas de hash MD5 existentes! –

+0

No soy un experto en criptografía, pero me gustaría ejecutar una función de hashing de contraseña en las contraseñas MD5 existentes. Para las contraseñas nuevas, primero debe hacer el viejo algoritmo MD5, luego alimentarlo a una función de hash de contraseña adecuada. Eso, o puede marcar de alguna manera si la contraseña está usando el algoritmo viejo o nuevo en la base de datos (o donde quiera que lo esté almacenando). – tangrs

+0

@tangrs Sus contraseñas originales también tienen hash MD5, ya está asegurado. Él quiere cambiar a SHA-512 con sal, que es más seguro. ¿Por qué le sugieres doble hash? Eso aún no resolvería la cuestión de cómo diferenciar entre la contraseña nueva y la antigua. Y para duplicar el hash es la seguridad a través de la oscuridad, que es tan buena como la falta de seguridad, porque nadie sabe qué demonios está pasando y cómo mantenerla. – Churk

4

Si hash con MD5 en primer lugar, solo tendrá la extensión de MD5 (128 bit). Una gran parte del espacio de SHA512 no estará cubierto por sus contraseñas. Por lo tanto, no aprovecha SHA512, pero no será peor que MD5.

Tiene la ventaja de que si alguien obtiene el hash SHA512 y no conoce la sal (esto tiene que aplicarlo de alguna manera) no puede buscar los códigos y obtener las contraseñas, algo que sería posible con el Base de datos MD5 que tienes ahora.

Así que sí, puede volver a configurar las contraseñas MD5 existentes. Pero como se explica en el primer párrafo, sería una mala idea aplicar MD5 a todas las contraseñas nuevas y luego hash como SH512. Una implementación fácil sería tener un campo booleano "salado" en la base de datos al lado de los hashes (pero no pongas la sal ahí).

+0

'pero no pongas la sal allí' - el objetivo de una sal es que no debe mantenerse en secreto y puede colocarse en texto plano junto a los valores hash (¡tiene un hash único por contraseña!). Además: ¿Es eso "hashing una contraseña de MD5 con SHA-512 que no hará ningún daño" basado en hechos reales o simplemente alguna intuición? Porque, en general, la aplicación de varios hashes en secuencia puede hacer más daño que bien. – Voo

+0

El objetivo de una función hash es que proporciona una asignación única entre una cadena de tamaño variable y una cantidad de n bits. Cualquier buena función hash evita colisiones y, de hecho, es extremadamente difícil producir colisiones en SHA-512 e incluso MD5 (a menos que tenga una longitud arbitraria, que no tiene contraseñas). Es trivial hacer un mapeo de un valor de 128 bits en un espacio de 512 bits (tiene 2^(512-128) valores no utilizados). Las colisiones (que es el daño) son extremadamente improbables (probabilidad 2^(128-512)). – j13r

0

Si observa cómo la mayoría de los empleados del Banco y de alta seguridad cambian las contraseñas.La mayoría de ellos, básicamente, le preguntan a las personas que están utilizando el antiguo método de encriptación para crear una nueva contraseña. Creo que primero es la solución de colocar una bandera en todos los antiguos usuarios de contraseñas MD5, y notificarles que necesitan crear una nueva contraseña y migrarlos lentamente al nuevo sistema. De esta forma, cuando se produce un problema al disparar el sistema si algo sale mal, no se preguntará si este es un nuevo usuario o uno anterior. ¿Somos hash dobles o solteros? Nunca se debe comparar dos hash como una posible respuesta porque ¿qué pasa si MD5 ('abc') => 123, SHA ('NO') => 123, eso significa que alguien podría haber ingresado la contraseña incorrecta pero aún así entrar.

Cuestiones relacionadas