当前位置: 首页 > 面试题库 >

Play Framework 2存储用户密码哈希的最佳方法

彭正谊
2023-03-14
问题内容

我的应用程序中有一个添加用户选项。我想将用户密码以哈希格式存储在数据库中。密码以纯文本格式存储在框架随附的示例代码中。经过一番搜索,我发现在play2中实现了一个Crypto.encryptAES()函数,可用于保护密码。

我的问题是使用它的最佳地点是什么?以及如何使用它来创建最可维护的代码?


问题答案:

我个人将在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);
}

我喜欢使控制器尽可能简单,就像我看到的控制器一样,就像在用户操作和业务模型(在模型内部!)之间的流量控制器一样。



 类似资料:
  • 问题内容: 我正在使用Redis来存储一些信息并检测该信息随时间的变化(例如,考虑用户和位置)。使用更长或更短的键名的值是什么?使用更长的键会更清楚,但是使用更长的键名是否会在内存或性能上付出很多成本? 以下是示例: 要么 问题答案: 这完全取决于您将如何使用它。如果每个字节都很重要,例如,当您必须为传输到云服务的每个kB支付费用时,您可以计算成本。数学很简单;一个字节是“在线”上的一个字节。在r

  • 我一直在研究散列/加密密码并将其存储在数据库中的正确方法。我知道盐和散列,所以我环顾四周,PBKDF2似乎是一个不错的选择。所以我找到了这个网站,它提供了一个很好的教程,以及一个适用于PHP的PBKDF2(这是我在我的网站上使用的)。 因此,我设置了我的网站,以使用这些功能生成/创建密码,但正如您在以下代码中看到的: salt在create_散列函数中生成,并存储在生成的散列中,该散列最终看起来像

  • 问题内容: 我的权限记录绑定到我的应用程序中的每个帐户。每个帐户可以具有一个或多个基于帐户类型的权限记录。这是示例: 上面的查询将为其中一个帐户产生这样的数据: 正如您在上方看到的,此帐户已分配了4条记录。访问类型可以是“完全”或“仅查看” 。访问级别可以是州“ S”,城市“ C”或建筑物“ B”。用户一次只能分配一个访问级别,因此,例如,不存在用户可以分配城市和州级别的情况。我的问题是,针对特定

  • 每个人在建构 PHP 应用时终究都会加入用户登录的模块。用户的帐号及密码会被储存在数据库中,在登录时用来验证用户。 在存储密码前正确的 哈希密码 是非常重要的。密码的哈希操作是单向不可逆的,该哈希值是一段固定长度的字符串且无法逆向推算出原始密码。这就代表你可以哈希另一串密码,来比较两者是否是同一个密码,但又无需知道原始的密码。如果你不将密码哈希,那么当未授权的第三者进入你的数据库时,所有用户的帐号

  • 我一直在使用来存储键值对,其中键和值都是sha256哈希摘要。我需要能够找出列表中是否存在一个键,并且能够检索该dict的值。 目前,根据我的一些测试,我估计需要大约10Gb的内存来存储8000000个哈希,因为实际存储的数据只有512MB(每个哈希32字节,所以每个记录64字节) 有人有什么建议吗? 更新,基于我认为应该更新的一些评论。我将散列存储为字节,而不是十六进制字符串。我使用sqlite

  • 问题内容: 可能的字段类型: 我该如何决定使用哪个? 问题答案: 如果出于性能原因,该列已建立索引并且您知道自己在做什么。 否则很好。但请确保该列使用ascii字符集。(例如)