Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 玩哈希密码返回错误结果_Hash_Passwords_Md5_Playframework - Fatal编程技术网

Hash 玩哈希密码返回错误结果

Hash 玩哈希密码返回错误结果,hash,passwords,md5,playframework,Hash,Passwords,Md5,Playframework,我正在使用Play 1.2.1。我想散列我的用户密码。我原以为Crypto.passwordHash会很好,但事实并非如此。passwordHash文档说它返回MD5密码哈希。我在fixture中创建了一些用户帐户,我在其中放置了md5密码哈希: ... User(admin): login: admin password: f1682b54de57d202ba947a0af26399fd fullName: Administrator ... 问题是,当我尝试登录时,会出

我正在使用Play 1.2.1。我想散列我的用户密码。我原以为
Crypto.passwordHash
会很好,但事实并非如此。passwordHash文档说它返回MD5密码哈希。我在fixture中创建了一些用户帐户,我在其中放置了md5密码哈希:

  ...
User(admin):
  login: admin
  password: f1682b54de57d202ba947a0af26399fd
  fullName: Administrator
  ...
问题是,当我尝试登录时,会出现如下情况:

user.password.equals(Crypto.passwordHash(password))
但它不起作用。所以我在我的
autentify
方法中放了一个log语句:

Logger.info("\nUser hashed password is %s " +
                    "\nPassed password is %s " +
                    "\nHashed passed password is %s",
                    user.password, password, Crypto.passwordHash(password));
密码散列确实不同,但是嘿!
passwordHash
方法的输出甚至不是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==
15:02:16164信息~
用户哈希密码为f1682b54de57d202ba947a0af26399fd

传递的密码是加密的。当您与十六进制编码的密码进行比较时,passwordHash返回base64编码的密码哈希。

正如Nickolay所说,您正在比较十六进制与Base-64字符串。此外,我建议使用加密工具,而不是Play的加密工具。

MD5输出16个字节的序列,每个字节(可能)具有0到255(包括)之间的任何值。当您想要打印值时,需要将字节转换为“可打印字符”序列。有几种可能的约定,两种主要的约定是十六进制和Base64

在十六进制表示法中,每个字节值表示为两个“十六进制数字”:这样的数字可以是十进制数字(“0”到“9”)或字母(从“a”到“f”,大小写无关)。因此,16个字节变为32个字符

在Base64编码中,每组三个连续字节被编码为四个字符,包含在64个可能字符(数字、小写字母、大写字母“+”和“/”)的列表中。可以添加一个或两个最后的“=”符号,以便编码的字符串由4的倍数组成

这里,“8WgrVN5X0gK6lHoK8mOZ/Q==”是16字节序列的Base64编码,第一个字节的值为241,第二个字节的值为104,然后是43,依此类推。在十六进制表示法中,第一个字节用“f1”表示,第二个字节用“68”表示,第三个字节用“2b”表示。。。16字节的完整序列的十六进制表示法是“f1682b54de57d202ba947a0af26399fd”,这是您期望的值


该类包含对Base64和十六进制符号进行解码和编码的方法。它还包含
Codec.hexMD5()
,它执行MD5散列,并以十六进制表示法而不是Base64返回值。

我个人认为文档应该提到这个细节。我想你可能喜欢下面链接中的答案,它建议如何在java中使用MD5。顺便说一句,使用简单的MD5散列作为密码不是很聪明。至少还应该有一个盐。@niels-我知道,但这只是一个学习游戏的简单示例项目!