2017-09-26 108 views
0

我需要在PHP中生成與在Java中生成的PBKDF2WithHmacSHA256算法相同的哈希。來自Java的「PBKDF2WithHmacSHA256」的PHP替代方案

我做了一些研究,發現兩種功能,似乎是連接到PBKDF2HMAC

我應該用什麼PHP函數?原生PHP函數甚至有可能嗎?

編輯#1

我的Java代碼,相同的結果,我需要在PHP

public static byte[] derivateKey(char[] password, byte[] salt, int iterations, int keyLengthBits) { 
     try { 
      SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); 
      PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, keyLengthBits); 
      SecretKey key = skf.generateSecret(spec); 
      byte[] res = key.getEncoded(); 
      return res; 

     } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { 
      throw new IllegalStateException("Could not create hash", e); 
     } 
    } 
+0

我認爲''hash_hmac('sha256',$ data,$ key)'是你想要的,但我不積極 - 嘗試一下。 –

+0

您應該首先將'sha256'作爲此函數的第一個參數。 –

+1

請從Java函數發佈輸入和輸出對。 – user151841

回答

1

您所提供的Java代碼實現基本上是hash_pbkdf2()。你只需要通過正確的PARAMS:

function derivateKey($password, $salt, $iterations, $keyLengthBits) 
{ 
    return hash_pbkdf2(
     'sha256', 
     $password, 
     $salt, 
     $iterations, 
     $keyLengthBits/8, 
     true 
    ); 
} 

顯然,PHP的hash_pbkdf2()接受散列算法作爲參數,但潛在的棘手區別是這些:

  • 它不符合RFC 2898在它的長度在十六進制編碼後應用,因此最後一個參數必須設置爲true以使其與規範一致。
  • 它接受以字節爲單位的輸出長度而不是位(因此爲什麼我們除以8)。

我不確定的唯一的事情是key.getEncoded()在您的示例代碼中做了什麼......沒有任何指定的編碼算法。
我發現一些文件暗示它應該是RAW,所以我提供的示例應該匹配它。如果沒有,你必須自己編碼。