【问题标题】:Different hashCode for the same string?相同字符串的不同hashCode?
【发布时间】:2015-05-24 13:11:45
【问题描述】:

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

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

【问题讨论】:

  • 你误会了。您不应该为此使用hashCode(),您应该使用安全哈希,并且您应该让数据库进行哈希和比较。
  • 如果两个(开箱即用)对象相等,则它们的哈希码也将相等。因此,如果您看到不相等的哈希码,则关联的字符串也不相等。如果没有看到一些代码,就无法说出你是如何走到这一步的。无论如何,正如@EJP 所提到的,您不应该以这种方式测试密码。
  • 服务器接收到的字符串是否与客户端发送的相同?

标签: java hashmap passwords client-server hashcode


【解决方案1】:

@EJP 已经(正确地)指出,您应该为此使用安全哈希函数,而不是 Java hashCode。

但是,我在客户端屏幕上写密码时得到的 HashCode 与服务器端接收到的字符串(密码)的 HashCode 不同。

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

【讨论】:

    【解决方案2】:

    你误会了。

    1. 您应该使用安全哈希,而不是hashCode() 方法。
    2. 您不得将明文密码存储在数据库中。您必须存储哈希值。
    3. 您应该让数据库进行散列和比较:

      SELECT COUNT(*) FROM USERS WHERE USERNAME = ? AND PASSWORD = MD5(?) 
      

      如果此查询返回 1,则用户和密码存在。如果它返回零,它们不会。另请注意,您不想区分错误的用户名和错误的密码,因为这是对攻击者的信息泄露。如上所述一起测试它们。

    【讨论】:

    • 在应用程序中做散列有什么问题? (服务器端)
    • @immibis 分发可能都在 SQL 中的功能没有多大意义。
    • SQL能够生成HTML;并不意味着这是个好主意。
    • 您应该使用带盐的安全哈希,而不是 MD5。见How to securely hash passwords?。
    • “分发所有可能都在 SQL 中的功能没有多大意义。” - 一个可能的点是减少数据库服务器上的负载。 (诚​​然,在这种情况下,这不是一个很有说服力的观点。)
    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2012-09-11
    相关资源
    最近更新 更多