tach hast funciones funcion encriptacion ejemplo descargar criptográficas algoritmo security password-protection password-hash

security - hast - funciones hash pdf



Cómo actualizar un esquema de almacenamiento de contraseña(cambiar el algoritmo de hashing) (6)

Me han pedido que implemente algunos cambios / actualizaciones en un sitio de intranet; hazlo ''prueba de futuro'' como lo llaman.

Encontramos que las contraseñas se truncan usando el algoritmo MD5. (El sistema ha existido desde 2001, por lo que fue adecuado en el momento).
Ahora nos gustaría actualizar el algoritmo de hash a uno más fuerte (BCrypt-hash o SHA-256).

Obviamente, no conocemos las contraseñas de texto simple y crear una nueva contraseña para la base de usuarios no es una opción *) .

Entonces, mi pregunta es:

¿Cuál es la forma aceptada de cambiar el algoritmo de hash sin tener acceso a las contraseñas de texto simple?
La mejor solución sería una solución que esté completamente ''detrás de escena''.

*) nosotros tratamos; Tratamos de convencerlos, usamos el argumento de la "edad de la contraseña", intentamos sobornarlos con café, intentamos sobornarlos con pastel, etc. Pero no es una opción .

Actualizar
Esperaba algún tipo de solución automática para resolver el problema, pero aparentemente no hay más opciones que simplemente ''esperar a que el usuario inicie sesión y luego convertir''.

Bueno, al menos ahora no hay otra solución disponible.


Agregue el campo de fecha y hora de cambio de contraseña a la base de datos.

Toda la contraseña establecida antes del día X, verifique usando MD5

Todas las contraseñas establecidas después del día X, verifique usando BCrypt o lo que sea.


Debe cambiar su base de datos de contraseñas para almacenar 3 elementos:

  1. Un identificador de algoritmo.
  2. Una cadena de sal aleatoria elegida por el servidor cuando primero calcula y almacena el hash de contraseña.
  3. El hash de la concatenación de salt + password utilizando el algoritmo especificado.

Por supuesto, estos solo podrían almacenarse juntos en un campo de texto con un delimitador:

"SHA256: this-is-salt: this-is-hash-value"

Ahora convierta sus entradas existentes a un valor con sal vacía y el algoritmo anterior

"MD5 :: this-is-the-old-md5-hash-without-salt"

Ahora tiene suficiente información para verificar todas las entradas de contraseña existentes, pero también puede verificar las nuevas entradas (ya que sabe qué función hash se utilizó). Puede convertir las entradas antiguas al nuevo algoritmo la próxima vez que los usuarios existentes inicien sesión, ya que tendrá su contraseña disponible durante este proceso:

  1. Si su base de datos indica que están usando el algoritmo antiguo sin sal, primero verifique la contraseña de la forma anterior verificando que el hash MD5 de la contraseña coincida. Si no, rechace el inicio de sesión.
  2. Si se verificó la contraseña, haga que el servidor elija una cadena salt aleatoria, calcule el hash SHA256 de salt + password, y reemplace la entrada de la tabla de contraseñas con una nueva que especifique el nuevo algoritmo, salt y hash.
  3. Cuando el usuario vuelva a iniciar sesión, verá que están usando el nuevo algoritmo, así que calcule el hash de la contraseña salt + y verifique que coincida con el hash almacenado.

Finalmente, después de que este sistema se haya ejecutado durante un tiempo adecuado, puede desactivar las cuentas que no se hayan convertido (si lo desea).

La adición de una cadena de sal aleatoria única para cada entrada hace que este esquema sea mucho más resistente a los ataques de diccionario usando tablas de arco iris.


Primero, agregue un campo a la base de datos para identificar si la contraseña está utilizando MD5 o el nuevo algoritmo.

Para todas las contraseñas que siguen utilizando MD5:

- En el proceso de inicio de sesión, donde verifica la contraseña ingresada por un usuario: almacene temporalmente la contraseña enviada por el usuario en la memoria (no hay problema de seguridad aquí, ya que está en la memoria en algún lugar) y haga el hash MD5 habitual y compare con el hash almacenado;

- Si se proporcionó la contraseña correcta (coincide con el hash existente), ejecute la contraseña almacenada temporalmente a través del nuevo algoritmo, almacene ese valor, actualice el nuevo campo para identificar que esta contraseña se ha actualizado al nuevo algoritmo.

(Por supuesto, solo usaría el nuevo algoritmo para cualquier usuario / nueva contraseña).


Puede almacenar, ya sea en el propio campo de hash (por ejemplo, "MD5: d41d8cd98f00b204e9800998ecf8427e") o en otra columna, qué algoritmo se usó para crear ese hash. Entonces tendrías que modificar el proceso de inicio de sesión para usar el algoritmo correcto al verificar la contraseña. Naturalmente, cualquier nueva contraseña se procesará utilizando el nuevo algoritmo. Con suerte, las contraseñas finalmente caducarán y, con el tiempo, todos los hashes MD5 se eliminarán.


No estoy completamente seguro de esta opción, ya que no soy un experto en criptografía. Por favor, corrígeme si me equivoco en algún momento aquí!

Creo que Dave P. tiene claramente la mejor opción.

... pero. Hay una solución automágica: hash de los hashes más antiguos. Es decir, tome los hashes actuales y vuelva a hacerlos con un algoritmo más fuerte. Tenga en cuenta que, según tengo entendido, aquí no obtiene ninguna seguridad adicional de la longitud de hash, solo la complejidad criptográfica agregada del nuevo algoritmo.

El problema es, por supuesto, que la verificación de una contraseña tendría que pasar por ambos hashes. Y tendrías que hacer lo mismo para cada nueva contraseña también. Que es, bueno, bastante tonto . A menos que quiera usar un esquema similar como el que explicó Dave P. para eventualmente volver a pasar a contraseñas de un solo hash con el nuevo algoritmo de hash ... en cuyo caso, ¿por qué molestarse con esto? (Concedido, podría usarlo en un llamativo "Seguridad mejorada para todas las contraseñas, ¡aplicado de inmediato!", Como en una presentación para trajes corporativos, con una cara relativamente seria ...)

Aún así, es una opción que puede aplicarse inmediatamente a todas las contraseñas actuales, sin ninguna fase de migración gradual.

Pero chico, oh chico, ¡alguien se va a reír mucho mirando ese código más adelante! :)


Como no conoce la contraseña de texto sin formato, tal vez debería crear un campo que indique la versión de la inscripción (como el PasswordVersion bit default 0 )

La próxima vez que el usuario intente iniciar sesión, verifique la contraseña con hash utilizando la versión actual del algoritmo, tal como lo hace hoy. Si coincide, hash nuevamente y actualiza el campo PasswordVersion .

Esperemos que no necesite una columna PasswordVersion más grande que un bit . =)