【问题标题】:Java - How do I undo a hashCode() and read as string?Java - 如何撤消 hashCode() 并读取为字符串?
【发布时间】:2015-04-22 20:24:13
【问题描述】:

我想在我的代码中存储密码……但由于它是一个在线程序,我想对密码保密(呃)。所以我使用了"Password Here".hashCode()。完美的。我得到了一个疯狂的新代码。现在如何查看密码(在密码字段 (JTextField) 中)是否与密码匹配。我不想要哈希码密码!我想要真正的密码! (hashCode()的反义词)

if (PasswordField.getText().equals("HASH NUMBER HERE!")) {
    login(username, password, address, port);

但是在这里我输入了已经是 hashCode()-ed 的数字...并且我希望它能够在我将其更改为 hashCode() 之前获取密码

我想将 hashCode()-ed 密码读入非 hashCode()-ed String。我该怎么做?

谢谢!

【问题讨论】:

  • 一点也不。与单个哈希码匹配的字符串数量理论上是无限的。
  • 你不能。无论如何,您不应该为此使用hashCode(改用加密哈希),但哈希设计是单向的。您可以通过检查其哈希值是否匹配来检查密码是否匹配 - 这样您就不需要需要存储原始密码...
  • 这是一个真正的应用程序还是只是在搞乱,因为您不应该使用.hashCode() 来保持密码的机密性或安全性......
  • 我只是在胡闹!
  • 那我该怎么做呢?

标签: java hash passwords hashcode


【解决方案1】:

您不能“撤消”(或“解密”)哈希码。哈希码不是一种加密形式。

首先,您不应该使用hashCode() 作为密码。您应该改用cryptographic hash function

加密散列函数的全部意义在于它是一种单向算法 - 给定一些输入,您可以计算散列,但是(实际上)不可能在以下情况下计算原始输入你只有哈希。

这通常是如何工作的,是这样的:

  • 在数据库中,您存储用户名和用户密码的哈希值。
  • 当用户登录时,您计算用户在登录时输入的密码的哈希值。
  • 您将该哈希值与数据库中的哈希值进行比较。如果它们相等,则用户输入了正确的密码。

如您所见,以这种方式“解密”哈希是没有必要的。

在实践中,它有更多的细节来确保它真正安全。您应该使用强大的加密哈希函数和salt 以使其更安全。在将其用于任何将在网络上可用的严肃应用程序之前,请务必仔细研究此内容。

【讨论】:

  • 很好的解释。但在某些时候,如果我需要读回密码。我怎么能用哈希值做到这一点
  • @MuthaiahPL 你不能,如果你只有哈希值。这就是重点......如果你真的需要密码(顺便说一句,你为什么需要这个?这应该不是必需的)你需要使用其他方法而不是散列。
【解决方案2】:

hashCode 没有对立面。要检查输入的密码是否等于散列(存储)版本,只需对输入的密码进行散列处理,然后对照已知(存储)散列进行检查。例如,使用 hashCode 方法,您可以比较密码的 int 值:

int storedHash = getStoredHash();
String password = passwordField.getText();
if ( storedHash != password.hashCode() ){
    //wrong
}

附注:您可能会考虑使用比 hashCode(MD5、SHA 等)更安全的东西。

【讨论】:

  • 但我不希望人们提取 .jar 文件并查看代码中的密码!
  • 他们不会,他们会看到密码的散列版本(应该存储的内容)
  • 等等!但有一个问题。我无法从 JTextField 中得到它。用户输入的密码是字符串! hashCode() 是一个整数!
  • @Maxie_Z 您从 JTextField 散列字符串。然后比较哈希值。
  • 字符串密码 = PasswordField.getText().hashCode();我收到一个错误......password 需要是一个 int!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 2013-06-11
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
相关资源
最近更新 更多