Java - 如何撤消hashCode()并读取为字符串?

时间:2015-04-22 20:24:14

标签: java hash passwords hashcode username

在我的代码中,我想存储密码......但由于它是一个在线程序,我想保密密码(duh)。所以我使用了"Password Here".hashCode()。完善。我有一个疯狂的新代码。现在我如何查看密码(在密码字段(JTextField)中)是否与密码匹配。我不想要HASHCODE-ED密码!我想要真正的密码! (与hashCode()相反)

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

但是在这里我输入已经是hashCode()的编号...我希望它能够在我将其更改为hashCode()之前获取密码

我想将hashCode() - ed密码读入非hashCoded() - ed字符串。我该怎么做?

谢谢!

2 个答案:

答案 0 :(得分:3)

您无法“撤消”(或“解密”)哈希码。哈希码不是加密形式。

首先,您不应将hashCode()用于密码。您应该使用cryptographic hash function代替。

加密哈希函数的重点在于它是一种单向算法 - 给定一些输入,你可以计算哈希值,但是(实际上)无法计算原始输入。你只有哈希。

这通常如何运作,如下:

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

如您所见,当您这样做时,没有必要“解密”哈希。

在实践中,有很多细节可以让它真正安全。您应该使用强大的加密哈希函数和salt来使其更安全。在将要在网上提供的任何严肃应用中使用之前,请务必仔细研究。

答案 1 :(得分:2)

hashCode没有反面。要检查输入的密码是否等于散列(存储)版本,只需对输入的密码进行散列并根据已知(存储的)散列进行检查。例如,使用hashCode方法,比较密码的int值:

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

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