Scala:使用jooqdsl和布尔方法
我有这个jOOQ 3.14.4、Scala 2.13代码,它与一些不推荐的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库获得)
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.PASSWORDTableField
中的实际字符串值
使用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
从加密的角度来看,为了将密码保存到生产数据库中,是否被认为是安全的?我不知道您第二个问题的答案(我建议您在新问题中提问。这两个问题没有关系)。以下是第一个问题的答案:
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");