我正在创建一个基于web的登录系统,为此,我使用MySQL作为我的后端,并使用JSPS和Servlet实现功能,还使用了一个名为Jasypt1.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()方法是唯一能够生成与存储在数据库中的密钥完全相同的密钥的方法(它已经经过了加密过程)。
无论如何,如果你有任何创建登录系统的经验,或者知道很多安全最佳实践,我希望你告诉我,如果你不觉得我的解决方案合适,你在这类问题上的经验是什么。
谢谢您抽时间见我。
发布于 2011-08-24 15:43:41
Jasypt使您可以轻松地进行这种密码检查,因此检查密码的代码非常好用。
我的主要评论是,在该方法中发生了两件许多事情。
获取sql用户连接消息console
检查密码
这意味着在该方法中所有的东西都是硬编码的
为了让情况变得更好,我会:
在其他地方使用记录系统来记录连接的配置(属性文件...)
不管怎么说,只有几件事可以让它更模块化。
现在,在生产系统中,大多数人更喜欢使用像Apache Shiro这样的框架,这样他们就可以轻松地更改身份验证机制,也可以轻松地配置角色和组。
瞧。希望这个答案能让你更好地理解。
发布于 2011-08-24 15:44:03
考虑到用户名在系统中是唯一的,您的解决方案读取用户信息和比较密码哈希是可以的,这是广泛使用的解决方案。只要整个过程都在服务器端完成,就不会有任何安全风险。
但是,如果您希望在实际应用程序中使用此类代码,则不应每次都创建连接,而应考虑使用连接池,例如apache commons dbcp,这进一步简化了开发;)
发布于 2011-08-24 18:22:18
还使用了一个名为jasypt1.8的库来加密密码
您不能加密密码。您应该对它们进行单向散列,并对散列进行比较。您不能提供任何可以被法律解释为其他人知道用户密码的方式。否则,你会失去交易的法律不可否认性,这会严重到让你破产的地步。你需要听取法律意见,这是非常非常严重的。
https://stackoverflow.com/questions/7171600
复制相似问题