Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中用$2y$散列密码_Java_Bcrypt - Fatal编程技术网

在java中用$2y$散列密码

在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{

我在java中对密码进行哈希处理时遇到了问题,因此当我尝试登录并写入密码时,我希望使用$2y$作为数据库中的相同格式对写入的密码进行哈希处理,因为它是FOSBundle用作加密方法的BCrypt,但我得到的哈希密码是以$2a$开始的,而不是以$2y$开始的,因此我无法比较它们是否有将$2a$hash更改为$2y$hash的方法

我的职能:

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。看,你看,我把我的函数