在PHP中使用哈希密码并使用Java验证(PASSWORD_BCRYPT& jBcrypt)

时间:2017-09-19 20:04:00

标签: java php bcrypt

我有关于密码哈希的问题。我在网页上使用这个:

$pw = password_hash($_POST[password], PASSWORD_BCRYPT);

之后,我将此结果存储在数据库中。使用我的Java Web服务,我想验证密码。为此,我使用这种方法:

   if (BCrypt.checkpw(password, dbPwd)){
       return Response.ok("ok").build();
   }

dbPwd是我存储的密码,密码是第一种方法的纯文本密码。不幸的是我收到此错误代码:

  

javax.servlet.ServletException:java.lang.IllegalArgumentException:   盐修订版无效

更新

我在互联网上发现,有一个" bug" Java方法使用2y,jBcrypt使用2a。我用2a尝试了它并且它可以工作,但我怎样才能解决这个问题/让它工作?

1 个答案:

答案 0 :(得分:0)

经过大量挖掘,我发现了jBcrypt库的较新实现:https://github.com/patrickfav/bcrypt

我使用Scala,但是概念基本相同,并且为了验证$2y$哈希,我创建了一个小实用程序函数:

import at.favre.lib._

  /**
    * Verifies an encrypted password against the expected value
    *
    * @link https://github.com/patrickfav/bcrypt
    * @param hash The hashed password (encypted with BCrypt version $2Y$)
    * @param password The unencrypted password string
    */
  private def verifyBcryptHash(hash: String, password: String): Boolean = {
    if (hash == null || hash.trim.isEmpty)
      false
    else
      BCrypt
        .verifyer()
        .verifyStrict(
          password.toCharArray(),
          hash.toCharArray(),
          BCrypt.Version.VERSION_2Y
        )
        .verified
  }