2014-12-28 53 views
-1

当我通过清除密码来检查用户的登录名,并在字符串上应用md5()时,md5散列等于存储在MySQL数据库中的md5散列(登录成功) 。相同的密码,但不同的md5散列

但我不想在我的POST函数中清楚地传递用户密码,所以我决定使用cryptoJS只发送密钥,然后解密PHP服务器端的密码。

问题是,当我使用解密的密码时,md5是不同的。这很奇怪,因为清除密码字符串与解密密码相同,并且md5散列值不同。

这样做:

var_dump($clearPassword); //Hello. 
var_dump($decryptedPassword); //Hello. 

但是:

var_dump(md5($clearPassword)); //3ea484671d7b00a1df4734ded1aa379c1. 
var_dump(md5($decryptedPassword)); //470a1ad08cbdebe075214591ea20fec9. 

正如你所看到的,这是完全一样的字符串,但MD5哈希不同的是,我注意到的var_dump()给作为输出:

string(16) for the $clearPassword; 
string(32) for the $decryptPassword; 

我试图改变字符串编码,但没有运气。任何人都可以解释为什么md5()的行为就像那些相同的密码字符串一样?再次感谢。

+0

是不是你在这里丢失'$'符号var_dump(md5(decryptedPassword))' – fpierrat

+0

你只是发送密钥然后解密PHP服务器端的密码,什么关键?你使用什么加密? (MD5不加密...) –

+0

@fpierrat对不起,是一个错字错误,我在我的文章中修改了它,与$无关。 –

回答

0

我可能会这么做,就像@fpierrat说的那样,只是在客户端进行加密,然后在PHP服务器上直接比较md5哈希。

+1

要小心,还要添加一个随机盐,就像我链接到的另一个答案所解释的那样...否则,它意味着您只需从客户端发送到服务器,存储在数据库中的确切字符串(密码的md5)然后就会像发送明文一样安全地发送密码;-)再次使用相同的链接,以节省时间,最终有兴趣的读者:http://stackoverflow.com/a/27555577/3872061 – fpierrat

3

解密密码与原始密码不一样。检查两个字符串的长度,检查编码,做一个字节到字节的比较。 “你好\ 0”和“你好\ 0”似乎是相同的,但它们不是。甚至“Hello \ 0”和“Hello \ 0 \ 0 \ 0”也不一样。也许解密算法给出一个32字节的字符串长度。

+0

这是非常有趣的你说的,事实上,我做了每个字节的比较字节,它是完全不同的!现在我想知道如何让我的两个字符串(清除密码+解密密码)看起来相同并具有相同的编码结构? –

+0

也许一个字符串是纯ASCII字符串(C字符串),另一个字符串是utf16或具有其他编码模式。在字符串编码方面,PHP非常繁琐,它并没有告诉你这么多。 –

+0

你又对了!清除的密码为ASCII,解密后的密码为UTF-8。我想知道该怎么做,以获得相同的编码... –

相关问题