Мне нужно сгенерировать в PHP тот же хэш, что и PBKDF2WithHmacSHA256
алгоритм генерирует в Java.
Я провел некоторое исследование и нашел две функции, которые, кажется, связаны с PBKDF2
а также HMAC
:
Какие функции 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()
принимает алгоритм хэширования в качестве параметра, но потенциально хитрые различия заключаются в следующем:
true
чтобы привести его в соответствие со спецификацией.Единственное, в чем я не уверен, так это в том, что key.getEncoded()
в вашем примере кода … нигде не указан алгоритм кодирования.
Я нашел несколько документов, предполагающих, что это должен быть RAW, поэтому пример, который я привожу, должен соответствовать этому. Если этого не произойдет, вам придется кодировать его самостоятельно.
Других решений пока нет …