java 从JPasswordField插入密码后从sql表中检索密码

jv4diomz  于 2023-01-11  发布在  Java
关注(0)|答案(1)|浏览(110)

我正在尝试实现一个登录页面,用户应该输入他们的名称和密码。这些值将从SQL表中进行比较,如果匹配,用户将被允许登录。但这里的密码使用 Swing 中的JPasswordField,在搜索密码时,SQL表提供了一个加密的密码,如[C@44d2e990。我无法比较密码,因为用户输入是字符串的形式,而表给出了一个加密的密码字符串。

JOptionPane.showMessageDialog(null, new String(passwordField.getPassword()));
PreparedStatement stmt = con.prepareStatement("select username, password from signup");
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
    String un = rs.getString("username");
    String pwd = rs.getString("password");
    JOptionPane.showMessageDialog(null,pwd);
    if (un.equals(textField.getText()) && pwd.equals(new String(passwordField.getPassword()))) {
        JOptionPane.showMessageDialog(null,new String(passwordField.getPassword()));
        JOptionPane.showMessageDialog(null, "Login Successful..");
        flag = 1;
        break;
    }
}
if (flag != 1) {
    JOptionPane.showMessageDialog(null, "Login unsuccessful..\nTry again.");
    textField.setText("");
    passwordField.setText("");
}
4smxwvx5

4smxwvx51#

我认为您需要做的第一件事是摆脱像[C@44d2e990这样的值是以任何方式加密的想法。
它是包含密码的字符数组在创建时的哈希码,根本没有办法恢复该数组中的密码在创建时的状态。
您还没有解释密码在数据库中是如何以[C@44d2e990的形式出现的。您只向我们展示了用户登录时查询数据库的代码。您需要首先了解密码在数据库中错误地以[C@44d2e990的形式出现的原因。任何这种形式的密码都是无用的,应该删除。
一旦您可以将密码正确地输入到数据库中,那么我希望您的问题中的登录代码可以正常工作,因为它确实处理了JPasswordField.getPassword()返回字符数组而不是字符串的事实。但是,我还没有测试它。我确实注意到,正如评论者所做的那样,你不需要从数据库表中提取所有的值,然后依次将它们与输入的详细信息进行比较:可以让数据库找到匹配的行(如果有),然后返回它。
最后,如果这段代码是为了您自己学习的目的,并且不会被其他人用于生产中,那么您可能可以不对密码进行散列,如评论中所讨论的。当然,在您可以使密码以纯文本形式工作之前,不要麻烦这样做。如果您确实想要密码,您需要查看加密散列,如SHA256(不要与.hashCode()返回的散列代码混淆),还需要考虑对散列进行加盐处理。

相关问题