Я работаю над проектом, в котором используется ручное хеширование паролей в Java, и мне поручено дублировать схему хеширования в NodeJS, чтобы пользователям не приходилось сбрасывать свои пароли.
Кажется, я не могу написать функцию хеширования, которая генерирует ключ, идентичный ключу, сгенерированному устаревшим кодом.
Я немного покопался во внутренностях каждой реализации и выявил ключевое отличие в том, что версия NodeJS измеряет длину ключа в байтах, а версия 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 были сосредоточены на какой-то другой незначительной проблеме, поэтому я здесь в растерянности.
salt
иpassword
в части Java. - person Robert   schedule 24.09.2019