爲了給你一些背景知識,我和我的團隊正在創建一個程序,用於將用戶名和密碼存儲在數據庫中。我們使用Java並通過Java代碼與數據庫進行交互。使用Jasypt:當密碼匹配時,checkPassword方法返回false。
我們使用Jasypt的用戶名和密碼進行加密。我正在使用Jasypt中的BasicPasswordEncryptor對兩者進行加密。用戶名可以很好地加密並存儲在數據庫中。但是,當檢查登錄並且所述BasicPasswordEncryptor嘗試檢查明文用戶名與加密密碼時,它始終返回false。我已經做了一系列檢查,以便將問題集中在發生問題的地方。據我所知,這是Jasypt的問題。有人知道這個問題是什麼,一個可能的解決方案,還是一個更優化的方法?謝謝。我將發佈代碼。
這裏就是加密發生。
public void register(String userName, String passWord){
String encryptedUsername = e.encryptPassword(userName);
String encryptedPassword = e.encryptPassword(passWord);
System.out.println("Registered eU: " + encryptedUsername);
try {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/PandaBox", "root", "");
statement = con.prepareStatement("insert into Users (username, password, logged) values (?,?,?)");
statement.setString(1, encryptedUsername);
statement.setString(2, encryptedPassword);
statement.setInt(3, 0);
boolean x = statement.execute();
System.out.println("IT REGISTERED");
} catch (SQLException o) {
o.printStackTrace();
}
}
其中「e」是BasicPasswordEncryptor對象。這是登錄檢查。
public boolean checkLogin(String inputedUsername, String inputedPassword) {
try {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/PandaBox", "root", "");
statement = con.prepareStatement("select * from Users");
rs = statement.executeQuery();
System.out.println(inputedUsername + "/" + inputedPassword);
while(rs.next()){
String usernameInDatabase = rs.getString("username");
System.out.println(usernameInDatabase);
if (e.checkPassword(inputedUsername, usernameInDatabase)) {
System.out.println("Username correct.");
statement = con.prepareStatement("select password from Users where username = ?");
statement.setString(1, usernameInDatabase);
rs = statement.executeQuery();
String passwordInDatabase = rs.toString();
if(passwordIsCorrect(inputedPassword, passwordInDatabase)){
return true;
}
}
}
return false;
} catch (SQLException o) {
// TODO Auto-generated catch block
o.printStackTrace();
return false;
}
}
該用戶不能使用WHERE子句「SELECT * FROM用戶」,這是因爲使用隨機鹽輸出不同 - 但每次「encryptPassword」所有valid--結果叫的。因此,考慮到他/她也正在使用此加密器來散列用戶名,因此無法生成允許在WHERE子句中使用等同運算符的值。唯一的方法是迭代它們並分別檢查每一個,就像這個用戶那樣。 – 2012-01-11 09:46:08
所以,他不應該用隨機鹽生成器來加密用戶。 – sfratini 2012-04-12 04:53:30
我們如何檢查數據庫中存在的值是否使用B crypt?謝謝,Neha – Prateek 2015-09-29 16:44:40