sha256 — альтернатива PHP для «PBKDF2WithHmacSHA256» с Явы

Мне нужно сгенерировать в 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);
}
}

0

Решение

Предоставленный вами код 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, поэтому пример, который я привожу, должен соответствовать этому. Если этого не произойдет, вам придется кодировать его самостоятельно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]