2012-08-13 17 views
10

Estoy en el proceso de actualizar varios proyectos para que no utilicen varios hashes de contraseñas basados ​​en MD5 inseguros/horriblemente inseguros. Ahora estoy, al menos, un poco mejor informado sobre las mejores prácticas, pero aún me pregunto si estoy haciendo algo mal. No he visto el proceso específico que estoy implementando usado en otro lugar, but at least one SO user seems to want to do something similar. En mi caso:¿Hay alguna ventaja de volver a hashtar contraseñas almacenadas en el momento del inicio de sesión?

  • Las contraseñas de contraseña se generan mediante bcrypt. (Dado que las opciones correctas parecen ser bcrypt, scrypt, o pbkdf2 y bcrypt fue más fácilmente accesible para mí en PHP.)

  • Se utiliza una sal diferente, aleatoria para cada hash. (Para evitar que los atacantes generen una tabla personalizada de arcoíris calculada con una única sal estática).

  • El hash, la configuración del algoritmo y el sal se almacenan juntos. (Dado que eso es lo que la función crypt de PHP me da para el valor hash)

  • Después de un inicio de sesión exitoso, el hash se vuelve a calcular con un nuevo sal aleatorio.

Es el último paso que me estoy preguntando. Mi intención aquí es permitir las actualizaciones del algoritmo de hash a medida que pasa el tiempo, de modo que los usuarios que inicien sesión regularmente tendrán sus contraseñas almacenadas en el formato más seguro disponible.

Mis preguntas son:

  1. Es esto una pérdida de tiempo?

  2. ¿Hay algún peligro al hacer esto?

Respuesta

3

ACTUALIZACIÓN comentario

de Re delnan: Si va a volver a hash de la contraseña ya hash, no lo hace - Nunca se sabe lo que puede ocurrir vulnerabilidades y ser hallado en cadena de hasta hashes. Obviamente, el otro lado de eso es que debes calcular toda la cadena hash cada vez que valides el secreto del usuario, así que simplemente vuelve a hash el texto claro.

ORIGINAL

I upvoted la mitad de la lectura. Parece que eres alguien que hace las preguntas correctas para hacer este tipo de trabajo.

  1. No es una pérdida de tiempo.
  2. Siempre hay peligros. Alguien podría obtener las contraseñas de sus usuarios mediante tortura o, más probablemente, ingeniería social. Alguien podría tener acceso a vastos recursos y, junto con su archivo de contraseñas ocultas, aún puede descifrar las contraseñas. Alguien podría comprometer su servidor insertando secretamente un troyano que intercepta las contraseñas de texto claro de los usuarios al inicio de sesión exitoso.

Por lo tanto, no hay garantía de una seguridad perfecta. Nunca. Pero estoy seguro de que ya lo sabes. Por eso me gustaría agregar solo una cosa:

  • Anime a los usuarios a elegir contraseñas difíciles de descifrar.

Y, en sentido estricto, si su única razón de refrito en cada inicio de sesión es para que las contraseñas se almacenan siempre utilizando la última actualización, entonces sí - el método es una pérdida de tiempo, suponiendo que no va a actualizar su Algoritmo en el inicio de sesión de cada usuario. Entonces habrá refrigerios que usan el mismo algoritmo y seguridad (presunta) para dos inicios de sesión en una fila. Una pérdida de unos pocos ciclos de reloj en el reacondicionamiento. Estrictamente hablando, no está optimizado. ¿Por qué no solo incluye una versión de algo en su tienda de contraseñas, y al iniciar sesión vuelve a aparecer si el sistema algo es más nuevo que el algoritmo hash del usuario?

+0

RE # 2 Creo que OP significaba peligros o vulnerabilidades específicas del enfoque al volver a mezclar con nuevas sales en cada inicio de sesión. – delnan

+0

Agregué dos oraciones para hablar de eso, gracias @delnan –

+0

He vuelto a haschar una contraseña hash, pero no de una manera que se relacione directamente con esta pregunta.Como una actualización única para todos los usuarios que usan contraseñas inseguras, almaceno un hash de su contraseña hash (así tengo bcrypt of md5) marcado para poder detectarlo. Esa es la razón original por la que empecé a volver a cifrar contraseñas en cada inicio de sesión, esto permitió actualizar esos casos especiales cuando los usuarios iniciaron sesión. – flergl

3

UDPATE

Lo sentimos. Completamente perdido su punto acerca del uso de algo más nuevo. Ésto es una cosa buena. :-) Pero como dije en mi respuesta original a continuación cuando el algo permanece igual, es inútil.

ORIGINAL

contraseñas rehashing es inútil, ya que si un atacante que ya se ha apoderado del hash que no están impidiendo cualquier cosa.

considerar lo siguiente:

  • Soy un usuario en su sitio con el hash: 1234567890.
  • Algunos atacante se apodera de ese hash.
  • Me conecto de nuevo y se cambia el hash.
  • Al atacante no le importan los cambios hash porque solo necesita un hash para intentar romperlo.

Así que nada se ha evitado. El atacante todavía tiene el hash y aún puede intentar romperlo. Un posible atacante solo está interesado en el resultado final (la contraseña) y no en los hash.

+0

Recompilar el hash para un algoritmo nuevo es bueno, pero solo actualizaría el hash cuando el algoritmo cambiara. Cambiar el hash cada vez podría permitir a otros desarrolladores pensar que es más seguro, mientras que no lo es. Sin embargo, no dañará la seguridad. – Steven

+0

Exactamente mi punto :) – PeeHaa

0
  1. Si alguien obtener acceso al hash cambiarlo cada vez que no ayudará en absoluto a menos que la persona tiene acceso a todas las actualizaciones y voluntariamente empezar de nuevo. esto no va a suceder y, si lo hiciera, tendrías un problema mucho más grande que eso.

  2. No, no hay peligro en esto, solo desperdicio de recursos del servidor.

-1

En realidad, evita que un atacante novato copie cookies en su navegador solo para suplantar ... por lo que si el propietario luego inicia sesión, con un hash modificado, registrará al atacante reduciendo los estragos en la cuenta de usuario.

Cuestiones relacionadas