¿Cómo puede un sistema imponer un número mínimo de caracteres modificados en las contraseñas, sin almacenar o procesar contraseñas antiguas en texto simple?

47

En algunos entornos, se requiere que los usuarios cambien un cierto número de caracteres cada vez que crean una nueva contraseña. Por supuesto, esto es para evitar que las contraseñas sean fáciles de adivinar, especialmente con el conocimiento de contraseñas antiguas, como las que podría tener un empleado fallecido para una cuenta de servicio compartido.

Tengo separado preguntas abierto para dirigir el botón presionando el botón de esta ejecución. Sin embargo, también tengo curiosidad por saber cómo funciona esta aplicación en la parte de atrás. Si una contraseña de texto no se puede derivar de un algoritmo de hash fuerte, ¿cómo determina el sistema cuántos caracteres se han cambiado en las nuevas contraseñas?

    
pregunta Iszi 19.04.2011 - 15:19
fuente

6 respuestas

41

No estoy seguro de comparar con todas las contraseñas que el usuario ha usado anteriormente, ya que realmente depende del sistema de hash que use y diría que si es posible derivar alguna similitud del hash, entonces no es muy bueno. sistema para empezar.

Pero suponiendo que el usuario tiene que proporcionar su contraseña actual cuando configura su nueva contraseña, al menos podría comparar la nueva con la actual, ya que ambas no estarán rotas en ese momento.

El módulo pam_cracklib en Linux comprueba contraseñas como esta y realiza algunas verificaciones básicas de forma predeterminada.

  • ¿La nueva contraseña es solo la contraseña anterior con las letras invertidas ("contraseña" frente a "sueño") o rotadas ("contraseña" frente a "asswordp")?
  • ¿La nueva contraseña solo difiere de la anterior debido al cambio de caso ("contraseña" frente a "Contraseña")?
  • ¿Al menos un número mínimo de caracteres en la nueva contraseña no están presentes en la contraseña anterior? Aquí es donde el parámetro "difok" entra en juego.

Puede encontrar más detalles al respecto aquí .

    
respondido por el Mark Davidson 26.05.2011 - 13:11
fuente
26

Esto se hace fácilmente con el cambio de contraseña (donde el usuario está y se le debe pedir que proporcione tanto la contraseña antigua como la nueva).

    
respondido por el frankodwyer 19.04.2011 - 15:28
fuente
6

Por lo general, cuando cambia su contraseña, primero debe ingresar la contraseña anterior. Esto es útil para la seguridad, para garantizar que alguien que pase cerca de su computadora no pueda cambiar la contraseña y bloquearlo rápidamente mientras está de espaldas. También permite que el servidor aplique las reglas de distancia de contraseña. El servidor solo necesita mantener la contraseña anterior en la memoria durante el tiempo que sea necesario para verificar que la nueva contraseña sea lo suficientemente diferente de la anterior. Nunca tiene que almacenar la contraseña no lavada.

Por cierto, tales reglas de cambio de contraseña son malas para la seguridad. (Sí, sé que usted es la víctima aquí). Si los usuarios tienen que cambiar su contraseña a menudo, elegirán una contraseña que sea muy fácil de recordar o la escribirán en un lugar de fácil acceso. Hay poca ventaja en la caducidad de las contraseñas, y la pérdida esperada en la seguridad de las contraseñas se debe a que los usuarios cambian sus contraseñas cada pocos meses más que las ventajas. Para un tratamiento más profundo de la caducidad de la contraseña, consulte ¿Cómo cambiar la contraseña cada 90 días aumenta la seguridad? y ¿Forzar a los usuarios a cambiar las contraseñas es útil? y ¿Requerir un cambio regular de contraseña pero almacenar contraseñas previas?

    
respondido por el Gilles 03.06.2013 - 23:38
fuente
5

El usuario debe ingresar la contraseña anterior y la nueva para un cambio de contraseña. Por lo tanto, la comparación de la nueva contraseña con la antigua se puede hacer fácilmente porque el usuario da la versión en texto simple.

Para comparar la nueva contraseña con contraseñas anteriores (que no sea la actual), la comprobación solo se puede realizar comparando los resultados de hash. Cualquier método que permita cualquier otra comparación sería un agujero de seguridad.

    
respondido por el Jacco 26.05.2011 - 14:41
fuente
5

Se puede hacer solo manteniendo hashes, incluso se puede hacer en varias iteraciones.

El método sería tomar la contraseña e iterarla a través del hashing algo y verificar las comparaciones con los valores almacenados.

Por ejemplo, la mayoría de los usuarios (y la gente de la mesa de servicio les encanta recurrir a este como último recurso con tipos de enojo importante) iterarán sus contraseñas de manera increíblemente sencilla.

Por lo tanto, tomar la contraseña: # foob @ r1 y hacerla # foob @ r2 que probablemente verás se puede probar sin conocimiento de # foob @ r1 realizando una fuerza bruta en el algoritmo rápidamente. Con la potencia de procesamiento moderna, podría recorrer los primeros 4 caracteres en menos de diez segundos.

Aunque, por razones de eficiencia, las últimas cuatro son las que las personas cambian, por lo que es probable que veas un mayor impacto por tu dinero allí. Si no va a ser consecutivo y no consecutivo, está esperando una gran espera para el usuario final y una gran parte del procesador.

    
respondido por el Ori 31.05.2011 - 02:08
fuente
4

Por lo general, cuando cambia su contraseña, primero debe ingresar la contraseña anterior. Esto es útil para la seguridad, para garantizar que alguien que pase cerca de su computadora no pueda cambiar la contraseña y bloquearlo rápidamente mientras está de espaldas. También permite que el servidor aplique las reglas de distancia de contraseña. El servidor solo necesita mantener la contraseña anterior en la memoria durante el tiempo que sea necesario para verificar que la nueva contraseña sea lo suficientemente diferente de la anterior. Nunca necesita almacenar la contraseña no dañada, y puede borrar el hash anterior tan pronto como haya almacenado la nueva.

Si el servidor comprueba la igualdad con las contraseñas antiguas, no solo la última, es una historia diferente. Es bastante fácil verificar la reutilización de contraseñas con hashes antiguos: para cada hash antiguo, calcule el hash de la nueva contraseña con el antiguo salt y compárelo con el valor de hash antiguo. En un sistema configurado correctamente, esto debería tomar unos segundos.

Es una cuestión diferente si el servidor está comprobando la similitud con las contraseñas antiguas, y no solo la igualdad con las contraseñas antiguas, sino la similitud con la anterior. Si el servidor utiliza hashes adecuados, debe probar las variaciones de la nueva contraseña y hash de cada variación con todas las sales antiguas. Eso podría tomar minutos o más con un número de variaciones no despreciables. Por lo tanto, si el servidor se queja de la similitud con una contraseña anterior, desconfiaría de que puedan almacenar contraseñas mal escritas.

Hay otro enfoque para la similitud, que es almacenar el hash de cada variación de contraseña, cada una de ellas con sal independientemente, tan pronto como se establece la contraseña. Pero eso no le compra mucho: el servidor todavía necesita calcular el hash de la nueva contraseña con todas estas sales, lo que todavía lleva mucho tiempo, demasiado para un cambio de contraseña típico.

Una forma de recuperar contraseñas antiguas que realmente funciona, pero que nunca he visto implementada en ninguna parte, es hacer lo siguiente en un cambio de contraseña, después de pedirle al usuario la contraseña anterior y antes de borrar la contraseña anterior de la memoria:

  • Derive una clave simétrica a partir de la nueva contraseña (usando un algoritmo de fortalecimiento de clave).
  • Derive una clave de la contraseña anterior de la misma manera.
  • Descifre la lista de contraseñas antiguas con la clave antigua.
  • Agregue la contraseña anterior a la lista.
  • Haga las comprobaciones de políticas: todas las contraseñas anteriores se conocen en este momento. Si la nueva contraseña pasa las comprobaciones ...
  • Cifre la lista de contraseñas antiguas con la nueva clave.
  • Cambie la contraseña y la lista cifrada de contraseñas anteriores de la base de datos.

Esto es algo arriesgado porque si la contraseña actual está comprometida, todas las contraseñas anteriores también están expuestas. Pero sí permite aplicar una política de distancia de contraseña a cualquier número de contraseñas anteriores con un esfuerzo de cálculo razonable.

    
respondido por el Gilles 04.06.2013 - 02:09
fuente

Lea otras preguntas en las etiquetas