PHP Java "PBKDF2WithHmacSHA256" 的替代方案

PHP alternative of "PBKDF2WithHmacSHA256" from Java

我需要在 PHP 中生成与 PBKDF2WithHmacSHA256 算法在 Java 中生成的相同的散列。

我做了一些研究,发现两个函数似乎与 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);
        }
    }

您提供的 Java 代码基本上是 hash_pbkdf2()。您只需要传递正确的参数:

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,所以我提供的示例应该匹配它。如果没有,您将不得不自己对其进行编码。