2017-01-25 2 views
-2

Добрый день,
Я создаю веб-приложение в Java, используя обычный JDBC
Я имею следующую архитектуру: Domain Model - Service Layer - DAO Layer
Service Layer является средний человек в CRUD операций
пароль и passhash практики обработки Java веб-приложение

Мой класс Пользователь имеет поле «пароль» (User.password)
Мой стол пользователя в БД имеет столбец «pass_hash»
я использую Bcrypt из spring.security и поэтому не хранить соль как отдельный колонка

Вопросы:

  1. Какие поля мне нужно иметь в модельном слое домена для обработки паролей? поле пароля? поле passHash? оба поля? другие мысли?
  2. После чтения переполнения стека я поймал идею не включать pass_hash, когда создаю экземпляр пользователя, если это действительно необходимо для целей безопасности. Вопрос в том, какой слой я должен опустить pass_hash: DAO? Сервисный уровень? Уровень DAO AFAIU должен отвечать только за связь с БД, поэтому я не делаю там дополнительных фильтров и не читаю пользователя из db полностью с pass_hash. Затем я устанавливаю пароль на нуль на уровне службы, как вы видите в методе чтения ниже.
  3. Какой слой должен содержать хеширование: DAO/Service? Я использую сервис (метод создания ниже)

UserService методы Пример

@Override 
public Long create(User user) { 
    String hashedPassword = BCrypt.hashpw(user.getPassword(), 
     BCrypt.gensalt(BCRYPT_SALT_LOG_ROUNDS)); 
    user.setPassword(hashedPassword); 
    return userDao.create(user); 
} 

@Override 
public User read(Long id) { 
    User user = userDao.read(id); 
    if (user != null) { 
     user.setPassword(null); 
    } 
    return user; 
} 

Спасибо

+0

Может быть, вы могли бы так любезно рассказать, что не так с моим вопросом, вместо того, чтобы ставить «-» без комментариев. – Sabine

ответ

0

Просто сохраните хэш пароля BCrypt, а не сам пароль.

+0

Вот что я делаю, у меня есть только столбец «pass_hash» в БД. Я сохраняю только хэшированный пароль. – Sabine

+0

Это правильный путь. – zaph

+0

Но что это значит? Нужно ли иметь два поля внутри моего класса User или только одно поле? Какой слой мне нужно использовать для пароля хеширования? Должен ли я избегать выбора хеша пароля, когда я читаю запись пользователя из БД? Как мне это сделать, если нужно? – Sabine