2011-06-08 10 views
5

Estoy usando Play 1.2.1. Quiero cifrar la contraseña de mis usuarios. Pensé que Crypto.passwordHash sería bueno, pero no lo es. La documentación de passwordHash dice que devuelve el hash de contraseñas MD5. He creado algunas cuentas de usuario en luminaria, donde pongo MD5 hash de la contraseña:¡Juego! hash password devuelve un resultado malo

... 
User(admin): 
    login: admin 
    password: f1682b54de57d202ba947a0af26399fd 
    fullName: Administrator 
    ... 

El problema es que cuando intento iniciar sesión, con algo como esto:

user.password.equals(Crypto.passwordHash(password)) 

y no lo hace trabajo. Así que puse una declaración de registro en mi método autentify:

Logger.info("\nUser hashed password is %s " + 
        "\nPassed password is %s " + 
        "\nHashed passed password is %s", 
        user.password, password, Crypto.passwordHash(password)); 

Y los hashes de contraseñas son de hecho diferentes, pero bueno! La salida de passwordHash método no es aún un hash MD5:

15:02:16,164 INFO ~ 
User hashed password is f1682b54de57d202ba947a0af26399fd 
Passed password is <you don't have to know this :P> 
Hashed passed password is 8WgrVN5X0gK6lHoK8mOZ/Q== 

¿Qué hay de eso? ¿Como arreglarlo? O tal vez tengo que implementar mi propia solución?

+0

BTW no es muy inteligente usar MD5-Hash simple para las contraseñas. Debe haber al menos una sal además. – niels

+0

@niels - ¡Lo sé, pero esto es solo un simple proyecto de muestra para aprender a jugar! – jjczopek

+0

Creo que te puede gustar la respuesta en el siguiente enlace, sugiere cómo usar md5 en java http: // stackoverflow.com/questions/415953/generate-md5-hash-in-java – engin

Respuesta

5

Crypto.passwordHash devuelve el hash de contraseña codificado en base64, mientras se compara con el código hexadecimal.

+2

Personalmente creo que la documentación debería mencionar este detalle. – jjczopek

2

como Nickolay dijo que estás revisando Hex vs Base-64 strings. Además, recomendaría usar BCrypt para eso, no la herramienta Crypto de Play.

3

MD5 genera una secuencia de 16 bytes, cada byte tiene (potencialmente) cualquier valor entre 0 y 255 (inclusive). Cuando desee imprimir el valor, debe convertir los bytes en una secuencia de "caracteres imprimibles". Existen varias convenciones posibles, siendo las dos principales hexadecimal y Base64.

En notación hexadecimal, cada valor de bytes se representa como dos "dígitos hexadecimales": dicho dígito es un dígito decimal ('0' a '9') o una letra (de 'a' a 'f', el caso es irrelevante). Los 16 bytes se convierten en 32 caracteres.

En la codificación Base64, cada grupo de tres bytes sucesivos se codifica como cuatro caracteres, tomados en una lista de 64 caracteres posibles (dígitos, letras minúsculas, letras mayúsculas, '+' y '/'). señales que uno o dos finales '=' se pueden añadir de manera que la cadena codificada consiste en un número de caracteres que es múltiplo de 4.

Aquí, '8WgrVN5X0gK6lHoK8mOZ/Q ==' es la codificación Base64 de una secuencia de 16 bytes, el primero tiene el valor 241, el segundo 104, luego el 43, y así sucesivamente. En notación hexadecimal, el primer byte se representaría por 'f1', el segundo por '68', el tercero por '2b' ... y la notación hexadecimal de la secuencia completa de 16 bytes es 'f1682b54de57d202ba947a0af26399fd', el valor que esperabas

La clase play.libs.Codec contiene métodos para decodificar y codificar notaciones Base64 y hexadecimales. También contiene Codec.hexMD5() que realiza el hash MD5 y devuelve el valor en notación hexadecimal en lugar de Base64.

Cuestiones relacionadas