Scala:使用jooqdsl和布尔方法

Scala:使用jooqdsl和布尔方法,scala,cryptography,jooq,password-encryption,jbcrypt,Scala,Cryptography,Jooq,Password Encryption,Jbcrypt,我有这个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()) 请注意,email和password是Strings 现在,我想用一个新的Java方法(我从jBCrypt库获得)

我有这个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())
请注意,
email
password
String
s

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

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
从加密的角度来看,为了将密码保存到生产数据库中,是否被认为是安全的?

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

  • 如何在jOOQ代码中使用BCrypt.checkpw(…)
  • 使用此方法签名,您必须从数据库中获取哈希密码,而不是使用SQL进行检查。不能在数据库中执行
    checkpw
    后面的Java逻辑。因此,请这样做:

    val user=Option(sql
    .selectFrom(用户)
    .where(USER.EMAIL.equal(EMAIL))
    .fetchOne())
    .filter(u=>BCrypt.checkpw(密码,u.getPassword))
    
    太棒了!如果我必须使用
    BCrypt.checkpw
    的话,这就是我能做的。它认为您依赖的假设是
    电子邮件
    由单个用户使用,否则它可能返回多条记录,性能可能会很差。我还研究了
    checkpw
    实际上做了什么,它确实调用了hash方法
    BCrypt.hashpw
    ,但不仅仅是检查
    hashpw(password,salt)==saved\u password
    (我不清楚为什么)。如果我只是比较保存的哈希值和新计算的哈希值,那么通过jooq,我可以做
    .and(USER.PASSWORD.equal(BCrypt.hashpw(PASSWORD,BCrypt.gensalt()))
    @rapt:我非常依赖于电子邮件在用户中是唯一的假设,因为你在查询中也是这样做的,我无法想象一个系统,也从未见过一个,然而,我很想得到纠正,你是对的,这封电子邮件在用户中是独一无二的。这在这里很有用我的意思是,在其他情况下,如果需要在对从数据库检索的记录使用某种过滤算法之前执行
    获取
    ,则可能会检索到许多记录,而不仅仅是一条。很高兴这里不是这样。
    // 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");