0

我有这个 jOOQ 3.14.4,Scala 2.13 代码,它与一些不推荐使用的Play代码混合在一起:

val user = Option(sql
  .selectFrom(USER)
  .where(USER.EMAIL.equal(email))
  .and(USER.PASSWORD.equal(crypto.sign(password)))
  .fetchOne())

注意emailpasswordStrings。

现在,我想用新的 Java 方法(我从库中获得)替换使用Play不推荐使用的代码:CryptojBCrypt

public static boolean checkpw(String plaintext, String hashed)

BCrypt.checkpw(...)1. jOOQ代码里面怎么使用?

equal不返回布尔值,如何提取 USER.PASSWORD 中的实际字符串值TableField

使用该BCrypt.checkpw方法的示例:

// Check that an unencrypted password matches one that has
// previously been hashed
if (BCrypt.checkpw(candidate, hashed))
    System.out.println("It matches");
else
    System.out.println("It does not match");

2.jBCrypt从密码学的角度来看,为了加密密码以将其保存在生产数据库中,是否被认为是安全的?

4

1 回答 1

2

我不知道您的第二个问题的答案(我建议您在一个新问题中提出。两者不相关)。这是您的第一个答案:

  1. 如何在 jOOQ 代码中使用 BCrypt.checkpw(...) ?

使用此方法签名,您必须从数据库中获取散列密码,而不是使用 SQL 进行检查。您无法checkpw在数据库中执行 Java 逻辑。所以这样做,而不是:

val user = Option(sql
  .selectFrom(USER)
  .where(USER.EMAIL.equal(email))
  .fetchOne())
  .filter(u => BCrypt.checkpw(password, u.getPassword))
于 2020-12-26T11:29:54.953 回答