Несовместимость длины PBKDF2 в Java и JavaScript - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь перенести код Java на JavaScript.Однако по некоторым причинам я получаю непоследовательные длины.Что-то подсказывает мне, что библиотека NodeJS crypto не работает должным образом.

хеш-файл Java

public class hash {
    public static void main(String[] args){
        try {
            String password = "password1";

            //random bytes (should be random)
            byte[] bArr = {0, 1, 2, 3, 4, 5, 6, 7};

            char[] salt = password.toCharArray();

            PBEKeySpec spec = new PBEKeySpec(salt, bArr, 100, 384);

            byte[] encoded = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(spec).getEncoded();

            System.out.println(encoded.length);
        } catch(Exception e) {}
    }
}

Напечатанный вывод - 48, что делаетсмысл из-за SHA-384.Однако мой код JavaScript выводит массив с 384 элементами.

Файл JavaScript

const crypto = require("crypto");

const key = "password1";

let bArr = [0, 1, 2, 3, 4, 5, 6, 7];

//create the salt (.toCharArray() in Java)
const salt = key.split("").join(",");

let encoded = crypto.pbkdf2Sync(key, Buffer.from(salt, "hex"), 100, 384, "sha1");

console.log(encoded.length);

Я не уверен, что я делаю здесь неправильно.Я нашел пару мест, где люди обсуждали, как создать ключ PBKDF2, и, похоже, именно так я и должен был.Кроме того, bArr в моем примере JavaScript не использовался.

Я попытался преобразовать обе encoded переменные в HEX для их сравнения, но JavaScript намного длиннее.Даже если я укоротю длину ключа до 48 (384 -> 48 в методе pbkdf2Sync()), это все равно неправильно.

...