2016-01-09 2 views
1

Я создаю базовую базу данных регистрации/логина имени пользователя/пароля, и мне интересно, правильный ли мой подход. Я не удовлетворен тем, что код работает, я хочу, чтобы он был чистым и эффективным.Доступ к базе данных пользователей из нескольких классов

Пользователи могут получить доступ к странице входа в Интернет, ввести учетные данные и войти в систему. У меня есть класс базы данных, который создает учетные записи и проверяет правильность введенных учетных данных.

Итак, класс базы данных:

public class Database { 

    private Connection   connection   = null; 
    private PreparedStatement preparedStatement = null; 
    private ResultSet   resultSet   = null; 

    // Method for registering a new account. Credentials are added into the database. 
    public void registerAccount(String username, String password, String ipAddress) { 

     try { 

      Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 
      connection = DriverManager 
      .getConnection("jdbc:derby:C:\\DB;create=true;upgrade=true"); 
      String query = "INSERT INTO Users (username, password, ip_address) VALUES" + "(?,?,?)"; 
      preparedStatement = connection.prepareStatement(query); 
      preparedStatement.setString(1, username); 
      preparedStatement.setString(2, password); 
      preparedStatement.setString(3, ipAddress); 
      preparedStatement.executeUpdate(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      close(); 
     } 

    } 

    private void close() { 

     try { 

      if (resultSet != null) { 
       resultSet.close(); 
      } 
      if (preparedStatement != null) { 
       preparedStatement.close(); 
      } 
      if (connection != null) { 
       connection.close(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

например: Когда пользователь нажимает отправить войти в систему, метод внутри класса базы данных называется:

// Checks if credetials are correct. 
public boolean checkLogin(String username, String password) { 

    try { 

     Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 
     connection = DriverManager 
       .getConnection("jdbc:derby:C:\\DB;create=true;upgrade=true"); 
     String query = "SELECT username, password from Users WHERE username = ? AND password = ?"; 
     preparedStatement = connection.prepareStatement(query); 
     preparedStatement.setString(1, username); 
     preparedStatement.setString(2, password); 
     resultSet = preparedStatement.executeQuery(); 

     if (resultSet.next()) { 
      String user = resultSet.getString("username"); 
      String pass = resultSet.getString("password"); 
      if (username.equalsIgnoreCase(user)) { 
       if (password.equals(pass)) { 
        return true; 
       } 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     close(); 
    } 
    return false; 
} 

У меня также есть несколько других методы в классе Database, чтобы проверить, не является ли имя пользователя при регистрации, или если учетная запись уже зарегистрирована на определенном IP-адресе и т. д. Является ли эта хорошая практика или существуют более эффективные способы ее достижения? Спасибо!

+0

Ну очень хорошо для меня. Хотя, поскольку это веб-система, я предлагаю вам взглянуть на такие рамки безопасности, как [Spring Security] (http://projects.spring.io/spring-security/) и делегировать такую ​​ответственность в уже хорошо документированную структуру , В вашем коде я бы предложил только некоторую технику хэширования, чтобы вы хэш-пароль пользователя и вставляли его, когда вы проверите хэш-строку, отправленную пользователем, и сравните ее, как вы делаете. Таким образом, даже вы не могли видеть пароль пользователя. –

ответ

0

Запросить запись через имя пользователя, чтобы получить зашифрованный пароль, и сравнить его с зашифрованным паролем с пользовательского ввода.

Настоящая ссылка How can I hash a password in Java?. PBKDF2 - хороший алгоритм для хэширования паролей.

byte[] salt = new byte[16]; 
random.nextBytes(salt); 
KeySpec spec = new PBEKeySpec("password".toCharArray(), salt, 65536, 128); 
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
byte[] hash = f.generateSecret(spec).getEncoded(); 
Base64.Encoder enc = Base64.getEncoder(); 
System.out.printf("salt: %s%n", enc.encodeToString(salt)); 
System.out.printf("hash: %s%n", enc.encodeToString(hash)); 

Here is the PBKDF2 one in python. Вам легко понять эту идею.

+0

Я не уверен, что знаю, как это сделать. вы могли бы привести короткий пример или место, где я мог бы немного почитать? – user2342352

+0

большое спасибо! – user2342352

+0

1. Криптографический модуль безопасности Spring @ https://docs.spring.io/spring-security/site/docs/3.1.7.RELEASE/reference/crypto.html; 2. Как добавить хэширование пароля PBKDF2 в проект на основе Spring Security @ http://www.michalklempa.com/2015/02/08/how-to-add-pbkdf2-password-hashing-to-a-spring-security основанный-проект / – caot

Смежные вопросы