2017-09-26 114 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,所以我提供的示例应该匹配它。如果没有,你必须自己编码。