Подтвердить что ты не робот

Play Framework 2 лучший способ хранения хэша пароля пользователя

У меня есть опция добавления пользователя в моем приложении. Я хотел бы сохранить пропуск пользователя в хэш-формате в базе данных. Пароль хранится в текстовом формате в примерах кодов, включенных в структуру. После некоторых поисков я обнаружил, что в Play2 реализована функция Crypto.encryptAES(), которая может использоваться для защиты паролей.

Мой вопрос - лучшее место для его использования? И как использовать его для создания наиболее удобного кода?

4b9b3361

Ответ 1

Лично я бы сделал это в модели User. У меня есть получатели для моих полей, поэтому в методе setPassword:

this.password = HashHelper.createPassword(password); 

Hashhelper - это просто одноэлементный класс для хэширования нескольких целей.

И в Hashelper я использую BCrypt, просто добавьте следующее к Build.scala

org.mindrot" % "jbcrypt" % "0.3m

И шифрование выглядит так:

/**
 * Create an encrypted password from a clear string.
 * 
 * @param clearString
 *            the clear string
 * @return an encrypted password of the clear string
 * @throws AppException
 *             APP Exception, from NoSuchAlgorithmException
 */
public static String createPassword(String clearString) throws AppException {
    if (clearString == null) {
        throw new AppException("empty.password");
    }
    return BCrypt.hashpw(clearString, BCrypt.gensalt());
}

И расшифровка выглядит так:

/**
 * Method to check if entered user password is the same as the one that is
 * stored (encrypted) in the database.
 * 
 * @param candidate
 *            the clear text
 * @param encryptedPassword
 *            the encrypted password string to check.
 * @return true if the candidate matches, false otherwise.
 */
public static boolean checkPassword(String candidate, String encryptedPassword) {
    if (candidate == null) {
        return false;
    }
    if (encryptedPassword == null) {
        return false;
    }
    return BCrypt.checkpw(candidate, encryptedPassword);
}

Мне нравится держать мои контроллеры настолько простыми, насколько это возможно, поскольку я вижу мои контроллеры так же, как контроллеры трафика между действием пользователя и бизнес-моделью (внутри моих моделей!).

Ответ 2

Я нашел гораздо более простое решение в Интернете по этому адресу: http://rny.io/playframework/bcrypt/2013/10/22/better-password-hashing-in-play-2.html

Сначала загрузите jbcrypt-xxx.jar в этот адрес.

В библиотеке Зависимости в файле build.sbt добавьте:

"org.mindrot" % "jbcrypt" % "0.3m"

Это функция для создания нового пользователя (расположенного в классе модели User):

  public static User create(String userName, String password) {
    User user = new User();
    user.userName = userName;
    user.passwordHash = BCrypt.hashpw(password, BCrypt.gensalt());
    user.save();
    return user;
  }

И, все еще в классе User, функция аутентификации:

public static User authenticate(String userName, String password) {
    User user = User.find.where().eq("userName", userName).findUnique();
    if (user != null && BCrypt.checkpw(password, user.passwordHash)) {
      return user;
    } else {
      return null;
    }

И это работает!