我正在创建一个基于Web的登录系统,为此我使用
MySQL作为我的后端,JSPS和Servlets用于功能,还使用一个名为jasypt 1.8的库来加密密码,以便以后将它们存储在MySQL上.
我的问题是:以下代码是否有任何问题(安全相关,最佳实践等……):
protected boolean verifyUser(String user, String pass) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
StrongPasswordEncryptor passwordEncryptor = new StrongPasswordEncryptor();
Connection conn = null;
String userName = "****";
String password = "****";
String url = "jdbc:mysql://localhost:3306/DB";
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(url, userName, password);
System.out.println("Database connection established");
PreparedStatement stmt = null;
stmt = conn.prepareStatement("SELECT * FROM DB.LOGINS WHERE USER = ?");
stmt.setString(1, user);
rs = stmt.executeQuery();
if(!rs.next()){
return false;
}
if(passwordEncryptor.checkPassword(pass, rs.getString("Password"))){
return true;
}
conn.close();
} catch (Exception e) {
}
return false;
}
我不知道将用户从数据库中取出然后将其与提供的密码进行比较是否正确(即我认为最好的方法是使用以下方法将信息从数据库中取出用户名和密码,而不仅仅是前者.遗憾的是我无法做到这一点,因为我无法生成密钥,因为库中没有方法可以做到(而且我无法在文档中找到生成密钥的算法).
我这样做是因为我使用的库有一个内置的随机盐生成器,它将自己存储在加密后创建的字符串中(如果重要的话,使用sha-256)和方法checkPassword()是唯一能够生成与数据库中存储的密钥完全相同的密钥(已经通过加密过程).
无论如何,如果您有创建登录系统的经验或了解许多安全最佳实践,我希望您告诉我,如果您找不到合适的解决方案,那么您遇到的问题是什么.
感谢您的时间.