Прочтите пароль Jasypt из базы данных для проверки - PullRequest
0 голосов
/ 18 июня 2020

Я играюсь с системой входа / регистрации для настольного приложения. У меня есть форма регистрации и форма входа, а учетная информация сохраняется в базе данных 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 (); но я не знаю, где именно это поместить в код входа и как это реализовать. Любая помощь была бы замечательной.

Спасибо.

1 Ответ

0 голосов
/ 19 июня 2020

Имя Java библиотеки Jasypt сокращено до «Java Simplified Encryption», и поэтому эта библиотека пытается избежать того, чтобы пользователи реализуют крипто-подпрограммы, которые становятся небезопасными из-за ошибок реализации.

Проверка пароля пользователя так же проста, как и ваше тестовое приложение - вам не нужно реализовывать часть шифрования, просто передайте пароль, введенный пользователем в вашей форме входа, и передайте его в часть проверки

Подробно: есть две части - в части 1 пользователь регистрируется с помощью своего userPassword и передает его методу encryptPassword:

String userPassword = "myPassword";
String encryptedPassword = passwordEncryptor.encryptPassword(userPassword);

encryptedPassword example: rCAgedhPnGoDZ1PF7hgspDIhLnLAHo536PSCKUfpYu8Yv0JHEcIZ3ZVHIHojBn1D

Этот зашифрованный пароль сохраняется в базе данных, и вы должны помнить что вы не можете восстановить исходный пароль из этой строки!

В части 2 пользователь пытается войти в систему со своим loginPassword и передает его методу checkPassword. Программа загружает encryptedPassword из базы данных и передает loginPassword вместе с encryptedPassword. Результат (логическое значение) проверяется, и следующие шаги в вашей программе зависят от результата, «истина» означает, что пароль для входа правильный, а «ложь» означает, что пароль для входа неверен.

String loginPassword = "myPassword";
if (passwordEncryptor.checkPassword(loginPassword, encryptedPassword)) {
      // correct!
      System.out.println("correct passsword");
} else {
      // bad login!
      System.out.println("password not correct");
}

Для получения дополнительной информации посетите веб-страницу «Простота использования»: http://www.jasypt.org/easy-usage.html

...