2009-06-18 18 views
5

¿Pueden los usuarios solicitar que su contraseña se envíe por correo electrónico a sí mismos si la contraseña se almacena como un valor hash?Recuperar contraseña cuando la contraseña está almacenada como un valor hash

¿Hay alguna manera de convertir un valor hash al valor de texto sin cifrar con la información adecuada (& qué información necesitaría)?

Si un usuario tiene el mismo valor de hash de contraseña almacenado en dos sitios, ¿su contraseña sería la misma para ambos sitios?

Respuesta

28

Si solo está almacenando un hash de la contraseña, entonces no. ... y solo debería almacenar un hash correctamente salado de su contraseña, de todos modos.

Los mecanismos de restablecimiento de contraseña son la alternativa adecuada.

+6

+1 para recordar el uso de SAL ... –

+1

Ver mi respuesta a continuación para el uso adecuado de la sal ... el almacenamiento de la sal derrota el propósito de usarlo .. . – jrista

+11

El propósito de salt es vencer las tablas de búsqueda, de modo que no es posible simplemente cortar una gran cantidad de contraseñas probables y buscar sus valores de hash. Eso no depende de mantener la sal en secreto. Además, si no lo almacena, ¿cómo diablos verifica la contraseña? –

7

En resumen, no. Con la mayoría de los algoritmos hash, puede tener múltiples entradas con la misma salida. A menudo es mejor ofrecer una opción de restablecimiento de contraseña.

10

Las contraseñas hash no se pueden recuperar en general (esto depende de la función de hash, no se pueden recuperar los hashes seguros). Si tienen el mismo hash en dos sitios, podrían tener la misma contraseña, esto depende de la sal hash usada por los sitios, qué método, etc.

Si su contraseña está almacenada de forma segura en un buen sistema hash, un proveedor nunca debería poder enviarle su contraseña por correo electrónico, debe restablecer su contraseña si la olvida.

3

Existen diferentes tipos de algoritmos hash. Algunos son más seguros que otros. MD5 es popular, pero inseguro. La familia SHA es otro conjunto más seguro de algoritmos.

Por definición, un hash es una función de una sola vía. No puede ser revertido.

http://en.wikipedia.org/wiki/Sha-1

+0

Plain SHA-1/2 es una mala idea. Necesitas una sal y algo para frenar la reducción. PBKDF2, bcrypt, scrypt son las opciones estándar. – CodesInChaos

+0

Estoy de acuerdo, normalmente solo uso bcrypt en estos días, pero de cualquier forma la pregunta era sobre revertir un hash que es imposible. (Y el uso de tablas de búsqueda de hashes conocidos no es lo mismo que invertir un hash). –

3

Si había una forma sencilla de recuperar la contraseña en texto claro, no habría ningún punto en el hash de las contraseñas, para empezar. En ese punto, podrías simplemente basar64 o ROT13. (¡No hagas eso!)

Como mencionan otros, utiliza otros métodos de recuperación de contraseñas. Realmente nunca hay una buena razón para tener acceso a contraseñas de texto claro.

Si el hash en dos sitios es el mismo, es probable que el usuario tenga la misma contraseña en ambos. Sin embargo, no está 100% garantizado, podría haber una colisión hash, pero eso es muy improbable.

+2

Y lo más probable es que ninguno de los dos sitios haya agregado sal. –

-1

La idea general detrás de almacenar un hash de una contraseña es asegurar que las contraseñas sean seguras ... incluso de aquellos que tienen acceso a la base de datos. La confianza nunca está implícita. Un hash es un algoritmo unidireccional, por lo que no hay forma de derivar la contraseña original de un código hash. Por lo general, cuando un usuario necesita recuperar su contraseña almacenada como hash, debe hacerles su pregunta secreta y enviarles su contraseña temporal, o enviarles un enlace temporal por correo electrónico donde pueden cambiar su contraseña. Esto garantiza que la contraseña nunca se almacene en texto claro, y que esté protegida de todas las miradas indiscretas, incluso de aquellas que se pueda suponer que son confiables.

+6

"y también almacenando la sal, entonces estás derrotando el propósito de tener sal en primer lugar." - esto es incorrecto. Tienes que almacenar la sal, y si no lo haces no puedes validar el hash. No existe una desventaja de seguridad para almacenar la sal; solo está ahí para vencer los ataques de búsqueda. – frankodwyer

+2

tengo que estar en desacuerdo con su comentario de que los listones deben descartarse inmediatamente. en su ejemplo de intercambio de contraseñas, entonces sí, la sal es única y debe descartarse. pero en la autenticación del usuario, se debe utilizar una sal por usuario y se debe almacenar con la contraseña para hacer que se pueda utilizar. por ejemplo, salar la contraseña con el nombre de usuario previene ataques de diccionario precalculados ya que se requiere un diccionario por usuario. – longneck

+0

Con toda la practicidad, la mayoría de los programadores no ponen sales en la base de datos, porque si alguien obtiene acceso a la base de datos y tiene los hashes, ellos también tendrán la sal. Las sales a menudo viven en el código de la aplicación. Otra idea es utilizar sales calculadas, como la salazón en función de cuándo se unió el usuario. – marr75

2

No hay forma de revertir los hashes de uso común. Pueden ser brutales (probando todas las posibles contraseñas) o puedes usar una lista de palabras (usando una lista de contraseñas comúnmente usadas) en combinación con la fuerza bruta para acelerarla un poco, pero sigue siendo un proceso muy lento y con uso intensivo de la CPU.

La mejor manera, que muchos sitios usan, para crear un botón "Restablecer contraseña" donde ingresa su nombre de usuario y correo electrónico, y si coinciden, le envía una contraseña aleatoria y le da un enlace a la página de inicio de sesión y puede iniciar sesión con su contraseña aleatoria y cambiar su contraseña.

0

Para hacer esto usted debe tener un modelo con los campos:

Hashed_password 
Salt 

Y lo que necesita saber el usuario método de hash de la contraseña (Aquí uso SHA1) Entonces se puede definir en su controlador:

def self.encrypted_password(password, salt) 
    string_to_hash = password + "wibble" + salt 
    Digest::SHA1.hexdigest(string_to_hash) 
end 

A continuación se puede comparar:

user.Hashed_password == encrypted_password(password, user.salt) 

True significa tha t "contraseña" es la contraseña para el usuario "usuario"

Cuestiones relacionadas