【问题标题】:Scala: using jOOQ DSL with boolean methodsScala:使用带有布尔方法的 jOOQ DSL
【发布时间】:2021-04-03 14:54:02
【问题描述】:

我有这个 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 方法(我从 jBCrypt 库中获得)替换使用 Play 已弃用 Crypto 的代码:

public static boolean checkpw(String plaintext, String hashed)

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

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 是否被认为是安全的,用于加密密码以将其保存在生产数据库中?

【问题讨论】:

    标签: scala cryptography jooq password-encryption jbcrypt


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了!如果我必须使用BCrypt.checkpw,似乎这就是我能做的。它认为您依赖于email 由单个用户使用的假设,否则它可能返回多个记录并且性能可能很差。我还研究了checkpw 的实际作用,它确实调用了哈希方法BCrypt.hashpw,但不仅仅是检查hashpw(password, salt) == saved_password(我不清楚为什么)。如果我只是比较保存的和新计算的哈希值,那么使用 jooq 我可以做到.and(USER.PASSWORD.equal(BCrypt.hashpw(password, BCrypt.gensalt())))
    • @rapt:我非常依赖电子邮件在用户中是唯一的假设,因为您在查询中也是如此,我无法想象一个系统,我也从未见过, 反之亦然,不过,我很想得到纠正。
    • 你是对的,电子邮件在用户中是唯一的。这在这里很有用。 — 我的意思是,在其他情况下,当需要在对从数据库检索到的记录使用某种过滤算法之前执行 fetch 时,可能会检索到许多记录,而不仅仅是一条。很高兴这里不是这种情况。
    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2019-06-26
    • 2014-06-18
    • 2017-09-12
    相关资源
    最近更新 更多