簡體   English   中英

在PHP中哈希密碼並使用Java進行驗證(PASSWORD_BCRYPT和jBcrypt)

[英]Hash password in PHP and verify with Java (PASSWORD_BCRYPT & jBcrypt)

我有一個關於密碼哈希的問題。 我在網頁上使用此:

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

之后,我將結果存儲在數據庫中。 我想使用Java Web Service驗證密碼。 為此,我正在使用此方法:

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

dbPwd是我存儲的那個,而password是第一種方法的純文本形式的密碼。 不幸的是,我收到以下錯誤代碼:

javax.servlet.ServletException:java.lang.IllegalArgumentException:無效的salt修訂版

更新

我在互聯網上發現Java方法使用2y,而jBcrypt使用2a則存在“錯誤”。 我在2a上嘗試過,並且可以正常工作,但是如何解決/使其正常工作呢?

經過大量研究后,我發現了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
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM