Java 同一字符串的不同哈希代码?

Java 同一字符串的不同哈希代码?,java,hashmap,passwords,client-server,hashcode,Java,Hashmap,Passwords,Client Server,Hashcode,我已经做了一个登录屏幕,想检查客户端在服务器数据库中输入的密码。如果它们的哈希代码匹配,则接受密码。但是,在客户端屏幕上写入密码时得到的哈希代码与服务器端收到的字符串密码的哈希代码不同 有人知道为什么吗?提前感谢您提供的任何见解 你误解了 您应该使用安全哈希,而不是hashcode方法。 不能在数据库中存储明文密码。您必须存储散列。 您应该让数据库进行哈希和比较: SELECT COUNT(*) FROM USERS WHERE USERNAME = ? AND PASSWORD = MD5(?

我已经做了一个登录屏幕,想检查客户端在服务器数据库中输入的密码。如果它们的哈希代码匹配,则接受密码。但是,在客户端屏幕上写入密码时得到的哈希代码与服务器端收到的字符串密码的哈希代码不同

有人知道为什么吗?提前感谢您提供的任何见解

你误解了


您应该使用安全哈希,而不是hashcode方法。 不能在数据库中存储明文密码。您必须存储散列。 您应该让数据库进行哈希和比较:

SELECT COUNT(*) FROM USERS WHERE USERNAME = ? AND PASSWORD = MD5(?) 
如果此查询返回1,则用户和密码存在。如果它返回零,则不会返回。还请注意,您不想区分错误的用户名和密码,因为这是对攻击者的信息泄漏。如上所述,同时测试它们


@EJP已经正确地指出,您应该为此使用一个安全的哈希函数,而不是Java哈希代码

但是,在客户端屏幕上写入密码时得到的哈希代码与服务器端收到的字符串密码的哈希代码不同


这是个谜。如果您使用的是String.hashCode,唯一可能的解释是您正在散列不同的字符串;e、 g.一个空格中可能有前导/尾随空格,而另一个空格中可能没有,或者一个空格被散列并添加了一个种子。我想,另一种可能的解释可能是您正在散列StringBuffer、StringBuilder、char[]或其他内容。

您误解了。你不应该为此使用哈希代码,你应该使用一个安全的哈希,你应该让数据库进行哈希和比较。如果两个开箱即用的对象相等,它们的哈希代码也会相同。因此,如果您看到不相等的散列码,那么关联的字符串也不相等。如果没有看到一些代码,就无法说明您是如何达到这一点的。总之,正如@EJP提到的,您不应该以这种方式测试密码。服务器是否接收到客户端发送的相同字符串?在应用程序中进行哈希运算有什么错?服务器-side@immibis分发SQL中可能包含的所有功能没有多大意义。SQL能够生成HTML;这并不意味着这是个好主意。你应该使用一个安全的散列加盐,而不是MD5。请参阅。分发SQL中可能包含的所有功能没有多大意义。-一种可能的做法是减少数据库服务器上的负载。诚然,这在本案中不是一个很有说服力的观点。