Я работаю над проектом, в котором реализовано ручное хеширование паролей в Java, и мне поручено продублировать схему хеширования в NodeJS, чтобы пользователи не могли сбросить свои пароли.
Я не могу показатьсянаписать хеш-функцию, которая генерирует ключ, идентичный ключу, сгенерированному унаследованным кодом.
Я немного покопался во внутренностях каждой реализации и определил ключевое отличие в том, что NodeJSверсия измеряет keyLength в байтах, а версия Java использует биты.Я учел это в своей текущей попытке, но все еще не повезло.
Реализация Java:
public static String hash(byte[] salt, String password) throws HashException {
try {
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 128);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
return encode(f.generateSecret(spec).getEncoded());
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
throw new HashException("Issues hashing the password", e);
}
}
Моя попытка в NodeJS:
const crypto = require("crypto")
const encodedsalt = "oFoz+aZuGX5Ad/HAa35HLw=="
const encodedpass = "fp+gXqcO7fBKuXuhZQPY/A=="
// decode
const decodedsalt = Buffer.from(encodedsalt, "base64")
const decodedpass = Buffer.from(encodedpass, "base64")
var key = crypto.pbkdf2Sync("13111789", decodedsalt, 65536, 16, "sha1")
var encodedKey = key.toString("base64")
Я ожидаю совпадения ключей, потому что каждая реализация использует одинаковый байтовый массив для соли и одинаковую строку для пароля.Вместо этого ключи совпадают только по длине.Я уверен, что есть некоторые особенности реализации, которые я не замечаю, но я не вижу этого!Любая помощь приветствуется - все остальные вопросы PBKDF2 были сосредоточены на какой-то другой незначительной проблеме, поэтому я в растерянности.