2010-12-14 48 views
5

Estoy usando Postgresql, hibernate y Java y necesito almacenar una contraseña. ¿Puede alguien sugerirme cómo cifrar la contraseña con md5? Más hay una mejor manera de almacenar una contraseña segura en la base de datosGuardar contraseña con Md5

Gracias

+0

Si oculta una contraseña con MD5 (u otro algoritmo hash), no es posible recuperar la contraseña original. Sin embargo, eso puede no ser necesario: a menudo todo lo que necesita hacer es verificar si la contraseña que ingresó el usuario es la misma que la almacenada, en cuyo caso puede calcular el MD5 (u otro hash) de eso y ver si obtiene lo mismo que lo que está almacenado. Pero si quiere usar la contraseña, por ejemplo, para iniciar sesión en una base de datos, necesitará la contraseña original y MD5 no es lo que desea. (BTW MD5 se considera roto, ¡así que es mejor elegir otro algoritmo!) – psmears

+0

No se puede "descifrar" el valor hash producido por md5 de ninguna manera, al menos por ahora. Si pudieras, básicamente lo "romperías". MD5 es una de las funciones hash criptográficas: http://en.wikipedia.org/wiki/Funcion_haz_criptográfica –

+3

*** NO UTILIZAR MD5 PARA CONTRASEÑAS! *** –

Respuesta

9

No use MD5 para hash de la clave. Está diseñado para la velocidad, lo que facilita el ataque. Use bcrypt en su lugar. Además, se supone que no debes intentar descifrar la contraseña después de que se haya almacenado. Vea los ejemplos en la página bcrypt para saber cómo verificar una contraseña de la entrada del usuario. Más information sobre cómo almacenar contraseñas de forma segura.

jBcrypt es realmente simple de usar también. He aquí cómo usted hash de una contraseña:

BCrypt.hashpw(password_from_user, BCrypt.gensalt()); 

y para verificar que:

BCrypt.checkpw(password_from_user, hashed_password_from_database) 
+1

¿Puede explicar por qué no usa md5 o sha1 ya que esa es una forma común de hacerlo? – JOTN

+0

El último enlace lo explica todo. – dagge

+0

Eso solo funciona hasta que alguien haga una compilación rápida como lo que sucedió con el antiguo algoritmo hash de Unix. – JOTN

5

MD5 no es una encryption algorithm - es un cryptographic hash function. Esto es muy diferente! Puede almacenar la contraseña hash en la base de datos, pero no puede (en general) recuperar la contraseña del hash de la contraseña. Esto es por diseño.

En algunos casos es posible obtener la contraseña de nuevo a partir del hash - por ejemplo, si la contraseña es una palabra del diccionario que se pudiese recuperar usando un dictionary attack. Si la contraseña es lo suficientemente corta y usa caracteres de un rango limitado, un ataque brute force o rainbow table podría recuperar la contraseña. Cuando almacena una contraseña hash, debe usar salt y key strengthening (por ejemplo, PBKDF2) para dificultar estos ataques.

También debe tener en cuenta que MD5 se considera roto y se recomienda no utilizarlo para nuevas aplicaciones. Hay mejores alternativas, por ejemplo SHA-256.

+0

De acuerdo. En mi opinión, SHA-256 en salt + password debería ser suficiente para el 99.9% de las aplicaciones. – cherouvim

2

Si va a utilizar un algoritmo hash, no puede (no puede) descifrar la contraseña. Usted hash la contraseña y almacena el hash. Cuando el usuario proporcione su contraseña en el futuro, la hash con el mismo algoritmo y compara el nuevo hash con lo que almacenaste antes.

Puede usar la clase MessageDigest en Java para calcular un valor. Ref: Get MD5 hash in a few lines of Java.

Editar: Además, estoy de acuerdo con los demás que dicen que ya no usan MD5 para esto. Es un viejo algoritmo que solía ser común, pero ha sido atacado hasta el punto de la inutilidad (para las contraseñas). Hay todo tipo de recursos en línea para la búsqueda inversa MD5.

0

Puede hacerlo en postgres si instala el módulo contrib pgcrypto.

Luego, puede cifrar las contraseñas de esta manera:

update ... set passwordhash = crypt('new password', gen_salt('md5')); 

Por supuesto que no puede descifrarlo en absoluto!

Como han señalado otros, esta puede ser una mala idea, dependiendo de lo que estés tratando de hacer. Me he visto obligado a utilizar MD5 antes porque otra aplicación lo exigió, pero no desea transmitir ese hash al mundo.

+1

No recomendaría usar una solución específica de DBMS con Hibernate. La portabilidad entre bases de datos es una gran ventaja para usarlo. – JOTN

+0

@JOTN Gracias, eso es interesante de saber. –

2

1) No hay descifrado para MD5.
2) MD5 es una tecnología antigua que es excelente para verificar si dos cadenas son iguales.
3) MD5 está sujeto a ataques de diccionario.
4) MD5 puede hacerse más seguro mediante el uso de una sal.
5) Usamos MD5 para la seguridad de bajo nivel porque el hash se puede duplicar fácilmente en todas las plataformas. (C++, vb.net, VB6, C#, php ...)

0

He encontrado que la biblioteca de cifrado Jasypt es bastante útil.

Cuestiones relacionadas