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