在java中用$2y$散列密码
我在java中对密码进行哈希处理时遇到了问题,因此当我尝试登录并写入密码时,我希望使用$2y$作为数据库中的相同格式对写入的密码进行哈希处理,因为它是FOSBundle用作加密方法的BCrypt,但我得到的哈希密码是以$2a$开始的,而不是以$2y$开始的,因此我无法比较它们是否有将$2a$hash更改为$2y$hash的方法 我的职能:在java中用$2y$散列密码,java,bcrypt,Java,Bcrypt,我在java中对密码进行哈希处理时遇到了问题,因此当我尝试登录并写入密码时,我希望使用$2y$作为数据库中的相同格式对写入的密码进行哈希处理,因为它是FOSBundle用作加密方法的BCrypt,但我得到的哈希密码是以$2a$开始的,而不是以$2y$开始的,因此我无法比较它们是否有将$2a$hash更改为$2y$hash的方法 我的职能: public void CheckLogin(String username,String password) throws SQLException{
public void CheckLogin(String username,String password) throws SQLException{
String requete = "Select * from user WHERE username ='"+username+"';";
ste = con.createStatement();
res = ste.executeQuery(requete);
while(res.next()) {
if (res.getString(2).equals(username)) {
System.out.println("Password FOS ="+res.getString(8));
String hashed2 = BCrypt.hashpw(password, BCrypt.gensalt(12));
hashed2 = "$2y$" + hashed2.substring(4);
System.out.println("HASHED PASSWORD =" + hashed2);
if (BCrypt.checkpw(res.getString(8),hashed2)) {
System.out.println("It matches");
} else {
System.out.println("It does not match");
}
}
}
}
他找不到我要找的用户,因为我给他传递的哈希密码“hashed2”在我的数据库中不一样,因为在我的数据库中它以$2y$开头,这个哈希方法根据前缀$2a$给出$2a$哈希密码,$2y$和$2b$用于存储算法版本。虽然$2y$在以前的实现中修复了一个bug,但该修复似乎仅限于PHP:
2011年6月,在BCrypt的PHP实现crypt_blowfish中发现了一个bug
其他人,包括canonical OpenBSD,都没有采用2x/2y的概念。
此版本标记更改仅限于crypt_河豚
因为看起来您正在使用JBCrypt,所以您将始终获得$2a$version。最新版本0.4肯定会使用它
您可以尝试比较不带版本前缀的哈希密码。我从来没有比较过PHP和JavaBCrypt实现,所以我不知道这是否可行。在代码中,可以执行以下操作:
// JBCrypt requires version $2a, change the prefix
String hashed2 = "$2a" + res.getString(8).substring(3);
if (BCrypt.checkpw(password, hashed2)) {
System.out.println("It matches");
}
如果您关心安全性,那么首先应该了解SQL注入攻击,并使用准备好的语句,而不是串联参数。是的,我完全同意你的观点,但我只是想先得到结果,然后我会使用事先准备好的陈述,但目前我只是testing@rustyx有没有办法制作一个以$2y$开头的散列密码?我查了一下互联网,用Bcrypt将数据库中的密码解密,结果很好现在我找不到如何在代码中使用java@AOUADISlim尝试愚蠢的
子字符串
方法,将代码添加到我的答案中。这个$2a
是在JBCrypt中硬编码的,所以这不会改变哈希实数值。我使用了ur代码,但它不起作用。当我使用BCrypt.checkpw(res.getString(8),hashed2)进行比较时,这是一个无效的salt修订错误@AOUADISlim请显示您的所有代码。我不知道您为什么要在开始时使用BCrypt.gensalt()
生成这个新的salt。看,你看,我把我的函数