我的应用程序中有一个添加用户选项。我想将用户密码以哈希格式存储在数据库中。密码以纯文本格式存储在框架随附的示例代码中。经过一番搜索,我发现在play2中实现了一个Crypto.encryptAES()函数,可用于保护密码。
我的问题是使用它的最佳地点是什么?以及如何使用它来创建最可维护的代码?
我个人将在User模型中执行此操作。我的领域有吸气剂,所以在setPassword方法中:
User
setPassword
this.password = HashHelper.createPassword(password);
该Hashhelper只是为多目的散列东西一个单例类。
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); }
我喜欢使控制器尽可能简单,就像我看到的控制器一样,就像在用户操作和业务模型(在模型内部!)之间的流量控制器一样。