在java中用$ 2y $哈希密码

时间:2018-04-07 17:08:36

标签: java bcrypt

我在java中遇到哈希密码的问题,所以当我尝试登录并写入我的密码时,我希望得到写入的密码哈希,使用$ 2y $作为我数据库中的相同格式,因为它是什么FOSBundle是使用BCrypt作为加密方法而不是我得到一个哈希密码,它以$ 2a $而不是$ 2y $开头,所以我无法比较它们是否有将$ 2a $哈希改为$ 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");
      }
    }
  }
}

他无法找到我正在寻找的用户,因为我传递给他的哈希密码"哈希2"在我的数据库中是不一样的,因为在我的数据库中它以$ 2y $为主星,这个hash方法给出$ 2a $哈希密码

1 个答案:

答案 0 :(得分:1)

基于BCrypt wiki前缀$ 2a $,$ 2y $和$ 2b $用于存储算法版本。尽管$ 2y $修复了以前实现中的一个错误,但这个修补程序似乎仅限于PHP:

  

2011年6月,在crypt_blowfish中发现了一个错误,这是一个BCrypt的PHP实现。

     

...

     

没有其他人,包括规范的OpenBSD,采用了2x / 2y的想法。   此版本标记更改仅限于crypt_blowfish。

由于看起来你正在使用JBCrypt,你将总是得到$ 2a $版本。最新版本0.4绝对使用它。

您可以尝试比较没有版本前缀的散列密码。我从来没有比较PHP和Java BCrypt实现,所以我不知道这是否有用。在您的代码中,您可以执行以下操作:

// 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"); 
}