Я играюсь с системой входа / регистрации для настольного приложения. У меня есть форма регистрации и форма входа, а учетная информация сохраняется в базе данных PostgreSQL. Я начал без шифрования информации, и все работает, но теперь я хочу зашифровать пароль для сохранения в базе данных. Я использую Jasypt и получил пароль для шифрования и сохранения в базе данных:
public void actionPerformed(ActionEvent e){
if(e.getSource() == registerButton){
try{
//connects to the database
Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/cc","pi","server");
//inserts values into table
PreparedStatement statement = conn.prepareStatement("insert into users values(?,?,?,?,?)");
statement.setString(1, firstName.getText());
statement.setString(2, lastName.getText());
statement.setString(3, email.getText());
statement.setString(4, username.getText());
//checks password to ensure confirmation matches
//encrypts password for storing in database
if(password.getText().equals(confPass.getText())){
StrongPasswordEncryptor passwordEncryptor = new StrongPasswordEncryptor();
String encryptPass = passwordEncryptor.encryptPassword(password.toString());
statement.setString(5, encryptPass);
statement.executeUpdate();
JOptionPane.showMessageDialog(null, "Registered Successfully");
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
}
else{
JOptionPane.showMessageDialog(null, "Password did not match");
}
} catch(SQLException f){
f.printStackTrace();
}
}
Это работает хорошо, и мой пароль зашифрован. Я не понимаю, с чего начать, чтобы получить пароль из базы данных, чтобы сравнить зашифрованный пароль с вводом пользователя. Моя форма входа для сравнения паролей (до шифрования пароля):
public void actionPerformed(ActionEvent e){
//verify users credentials and signs in
if(e.getSource() == login){
try{
//connects to the database
Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/cc","pi","server");
//inserts values into table
PreparedStatement statement = conn.prepareStatement("SELECT username, user_pass FROM users WHERE username = ? and user_pass = ?");
statement.setString(1, username.getText());
statement.setString(2, password.getText());
ResultSet result = statement.executeQuery();
if (result.next()) {
frame.dispose();
new CommunityCooks();
}
else {
JOptionPane.showMessageDialog(null, "Username or Password did not match.");
}
}
catch(SQLException f){
f.printStackTrace();
}
}
Я сделал тестовое приложение, чтобы сравнить зашифрованные пароли и получить общее представление о том, как это работает:
import org.jasypt.util.password.StrongPasswordEncryptor;
public class EncryptTest {
public static void main(String[] args) {
String userPass = "test";
StrongPasswordEncryptor passwordEncryptor = new StrongPasswordEncryptor();
String encryptPass = passwordEncryptor.encryptPassword(userPass);
System.out.println(encryptPass);
if(passwordEncryptor.checkPassword("test", encryptPass)){
System.out.println("correct");
}
else{
System.out.println("wrong");
}
}
}
Часть, на которой я остановился, пытается получить зашифрованный пароль и сравнить его с вводимым пользователем паролем для проверки. Я считаю, что мне нужно зашифровать входной пароль, а затем использовать passworEncryptor.checkPassword (); но я не знаю, где именно это поместить в код входа и как это реализовать. Любая помощь была бы замечательной.
Спасибо.