20

アプリにユーザーの追加オプションがあります。ユーザーパスをハッシュ形式でデータベースに保存したいのですが。パスワードは、フレームワークに含まれているサンプルコードにプレーンテキスト形式で保存されます。いくつか検索したところ、パスワードを保護するために使用できるCrypto.encryptAES()関数がplay2に実装されていることがわかりました。

私の質問は、それを使用するのに最適な場所はどこですか?そして、それを使用して最も保守しやすいコードを作成する方法は?

4

2 に答える 2

32

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);
}

私は、コントローラーをユーザーアクションとビジネスモデル(モデル内!)の間のトラフィックコントローラーと同じように見ているので、コントローラーをできるだけシンプルに保つのが大好きです。

于 2013-03-27T21:58:34.627 に答える
4

私はこのアドレスでウェブ上ではるかに簡単な解決策を見つけました:http: //rny.io/playframework/bcrypt/2013/10/22/better-password-hashing-in-play-2.html

まず、このアドレスでjbcrypt-xxx.jarをダウンロードします。

build.sbtのlibraryDependenciesに、次を追加します。

"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;
    }

そしてそれは動作します!

于 2014-07-04T11:49:23.323 に答える