2009-09-04 25 views
14

Tengo una aplicación antigua que tiene contraseñas de usuario almacenadas en la base de datos con un hash MD5. Me gustaría reemplazar esto con algo de la familia SHA-2.¿Cómo convierto hash de contraseñas de MD5 a SHA?

He pensado en dos formas posibles de lograr esto, pero ambas parecen bastante torpes.

1) Agregue un campo "bandera" booleano. La primera vez que el usuario se autentique después de esto, reemplace el hash de contraseña MD5 con el hash de contraseña SHA y configure el indicador. Luego puedo verificar la bandera para ver si el hash de la contraseña se ha convertido.

2) Agregue un segundo campo de contraseña para almacenar el hash SHA. La primera vez que el usuario se autentique después de esto, configure la contraseña con SHA y guárdela en el nuevo campo (probablemente elimine su hash MD5 al mismo tiempo). Entonces puedo verificar si el campo SHA tiene un valor; esto esencialmente se convierte en mi bandera.

En cualquier caso, la autenticación MD5 debería permanecer en su lugar por algún tiempo para cualquier usuario que inicie sesión con poca frecuencia. Y los usuarios que ya no estén activos nunca serán cambiados a SHA.

¿Hay una mejor manera de hacerlo?

+3

su hijo de dos las soluciones se ven bien para mí – wtaniguchi

+0

Y estoy mejorando la respuesta de Ned, él tiene un buen punto allí. – wtaniguchi

+5

En cuanto a los usuarios que nunca cambian, lo consideraría después de cambiar un cierto porcentaje de personas y haber pasado el tiempo suficiente para deshacerse de los hash MD5. Las personas que no hayan iniciado sesión durante ese período de tiempo deberán restablecer sus contraseñas cuando vuelvan a conectarse. Si o no (y cuándo) eso es aceptable es una decisión comercial. –

Respuesta

11

En esencia la misma, pero tal vez más elegante que añadir campos adicionales: En el Marco Jurídico de autenticación predeterminado en Django, los hashes de contraseñas se almacenan como cadenas construidas de esta manera:

hashtype$salt$hash 

Hashtype es o SHA1 o MD5, salt es una cadena aleatoria usada para poner la contraseña sin procesar y al final viene el hash.Valor de ejemplo:

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4 
+0

Esta es la mejor respuesta. –

+0

El único problema con esto es que almacena la sal de forma tal que obviamente es la sal, en lugar de usar otro valor único o derivado para el usuario (como una versión mutada de la marca de tiempo de creación de su cuenta o un bit -flipping su nombre de usuario, etc.). Es discutible si esto hace que cualquier diferencia actualmente factible en cuanto al tiempo de craqueo, solo soy paranoico. – defines

+0

@Dustin: la fuerza adicional aquí es que la sal se puede cambiar cada vez que el usuario cambie su contraseña. – Joshua

3

Creo que ya tienes las mejores posibilidades. Me gusta # 1 más que # 2, ya que no hay uso para el md5 una vez que se establece el sha.

No hay forma de revertir el MD5, por lo que debe esperar a que el usuario se autentique de nuevo para crear un nuevo hash.

0

Su segunda sugerencia me parece la mejor. De esta manera, los usuarios frecuentes tendrán una experiencia más segura en el futuro.

El primer modo de "peculiaridades" es su código base y solo se asegura de que los nuevos usuarios tengan la mejor experiencia SHA.

+0

Para mí, parece que las dos soluciones son las mismas, solo implementadas de forma ligeramente diferente. De cualquier forma, su contraseña se vuelve a generar en su próximo inicio de sesión. –

+0

En cualquiera de las opciones, reemplazaría las contraseñas de los usuarios existentes la próxima vez que inicien sesión. Solo se trata de saber a la aplicación qué hash usar después de eso. –

2

No, básicamente, tendrá que mantener el MD5 en su lugar hasta que se hayan convertido todos los usuarios que le interesan. Esa es la naturaleza del hash: no tienes suficiente información para realizar la conversión nuevamente.

Otra opción acorde con las otras sería hacer que el campo de la contraseña sea autodescriptivo, por ejemplo,

MD5:(md5 hash) 
SHA:(sha hash) 

A continuación, puede detectar fácilmente qué algoritmo utilizar para la comparación y evitar tener dos campos. Una vez más, sobrescribiría el MD5 con SHA a medida que avanzara.

Desea hacer una actualización inicial para que todas las contraseñas actuales se declaren como MD5.

+4

El tamaño del hash lo autodescribe: MD5 siempre es más pequeño. –

+2

La longitud no debe usarse como único indicador. Es posible que desee cambiar lo que se incluye en el hash (por ejemplo, cálculos de nceles, otros datos iniciales) mientras usa el mismo algoritmo hash para cortarlo todo. Tener un identificador separado le indica cuál de los * * esquemas de hash de contraseña está en uso. – Rob

+1

Si sus dos únicos métodos difieren en longitud, entonces ciertamente puede usar la longitud como un indicador. –

-1

Si los MD5 no están salados, siempre puede usar un sitio de descifrado/tablas de arco iris como: http://passcracking.com/index.php para obtener las contraseñas. Sin embargo, probablemente sea más fácil simplemente usar el método de recodificación.

+5

Si es factible, esto no es muy ético, a menos que tenga mucho cuidado de no almacenar ninguna contraseña mientras la descifra. –

+3

@Vinko: por alguna razón, no es ético, incluso si se cuida de evitar que la contraseña se guarde o se filtre. –

6

Usted puede convertir todos sus cadenas MD5 SHA1 a refrito por ellos en su base de datos si crea sus contraseñas futuras por primera MD5ing ellos. Verificar las contraseñas también requiere MD5ing, pero no creo que sea un gran éxito.

código PHP (login):

Anterior: $ login = (md5 ($ password) == $ storedMd5PasswordHash);

después: $ login = (sha1 (md5 ($ password)) == $ storedSha1PasswordHash);

Funciona también con salazón, obtuvo la idea inicial de here.

-4

Sí usted debe conocer la contraseña real, primero antes de convertirlo en SHA-1 ..

Si usted quiere encontrar la contraseña real a partir de la cadena md5 cifrado, puede intentar md5pass.com

+3

Esto nunca debería ser posible en un sistema bien diseñado. Todas las contraseñas deben almacenarse saladas. –