gpt4 book ai didi

java - 从多个类访问用户数据库

转载 作者:太空宇宙 更新时间:2023-11-04 13:03:48 25 4
gpt4 key购买 nike

我正在创建一个基本的注册/登录用户名/密码数据库,我想知道我的方法是否正确。我对代码的运行并不满意,我希望它干净、高效。

用户可以访问互联网登录页面,输入凭据,然后基本上登录。我有一个数据库类,它创建帐户并检查输入的凭据是否正确。

所以,数据库类:

public class Database {

private Connection connection = null;
private PreparedStatement preparedStatement = null;
private ResultSet resultSet = null;

// Method for registering a new account. Credentials are added into the database.
public void registerAccount(String username, String password, String ipAddress) {

try {

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
connection = DriverManager
.getConnection("jdbc:derby:C:\\DB;create=true;upgrade=true");
String query = "INSERT INTO Users (username, password, ip_address) VALUES" + "(?,?,?)";
preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
preparedStatement.setString(3, ipAddress);
preparedStatement.executeUpdate();

} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}

}

private void close() {

try {

if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}

}
}

例如:当用户点击提交登录时,会调用Database类中的一个方法:

// Checks if credetials are correct.
public boolean checkLogin(String username, String password) {

try {

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
connection = DriverManager
.getConnection("jdbc:derby:C:\\DB;create=true;upgrade=true");
String query = "SELECT username, password from Users WHERE username = ? AND password = ?";
preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
resultSet = preparedStatement.executeQuery();

if (resultSet.next()) {
String user = resultSet.getString("username");
String pass = resultSet.getString("password");
if (username.equalsIgnoreCase(user)) {
if (password.equals(pass)) {
return true;
}
}
}

} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
return false;
}

我在数据库类中还有一些其他方法来检查注册时是否未使用用户名,或者帐户是否已在特定 IP 上注册等。这是好的做法还是有更好、更有效的方法来实现这一点?谢谢!

最佳答案

通过用户名查询记录,得到加密后的密码,并与用户输入的加密后的密码进行比较。

这里有一个引用How can I hash a password in Java? 。 PBKDF2 是一种很好的密码哈希算法。

byte[] salt = new byte[16];
random.nextBytes(salt);
KeySpec spec = new PBEKeySpec("password".toCharArray(), salt, 65536, 128);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] hash = f.generateSecret(spec).getEncoded();
Base64.Encoder enc = Base64.getEncoder();
System.out.printf("salt: %s%n", enc.encodeToString(salt));
System.out.printf("hash: %s%n", enc.encodeToString(hash));

Here is the PBKDF2 one in python 。您很容易明白这个想法。

关于java - 从多个类访问用户数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34689145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com