PHP Java "PBKDF2WithHmacSHA256" 的替代方案
PHP alternative of "PBKDF2WithHmacSHA256" from Java
我需要在 PHP 中生成与 PBKDF2WithHmacSHA256
算法在 Java 中生成的相同的散列。
我做了一些研究,发现两个函数似乎与 PBKDF2
和 HMAC
相关:
- hash_pbkdf2 - http://php.net/manual/en/function.hash-pbkdf2.php
- hash_hmac - http://php.net/manual/en/function.hash-hmac.php
我应该使用哪些 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,所以我提供的示例应该匹配它。如果没有,您将不得不自己对其进行编码。
我需要在 PHP 中生成与 PBKDF2WithHmacSHA256
算法在 Java 中生成的相同的散列。
我做了一些研究,发现两个函数似乎与 PBKDF2
和 HMAC
相关:
- hash_pbkdf2 - http://php.net/manual/en/function.hash-pbkdf2.php
- hash_hmac - http://php.net/manual/en/function.hash-hmac.php
我应该使用哪些 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,所以我提供的示例应该匹配它。如果没有,您将不得不自己对其进行编码。