我正在尝试将一些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密钥,看来这就是我应该做的。另外,我的JavaScript示例中未使用bArr
。
我尝试将两个encoded
变量都转换为HEX以进行比较,但是JavaScript变量要长得多。即使我将密钥长度缩短为48(384 -> 48
方法中的pbkdf2Sync()
),仍然是错误的。