差异b / w Node.js和Java中的PBKDF2实现

时间:2018-02-14 12:59:47

标签: java node.js encryption pbkdf2

我正在尝试实现在Node.js中生成PBDKF2密钥的Java代码,但结果在这两种情况下都不同。 这是Java代码:

String passphrase = "1234";
String salt = "1234";
int key_size = 128; //bits
int iteration_count = 1000;
SecretKeySpec key = null;

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), hex(salt), iteration_count, key_size);
key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
System.out.println(hex(key.getEncoded()));

public static byte[] hex(String str) {
    try {
        return Hex.decodeHex(str.toCharArray());
    } catch (DecoderException var2) {
        throw new IllegalStateException(var2);
    }
}

输出为:1b1b653ea60ee1d82ecb22f7f59b7c43

Node.js代码:

var crypto = require("crypto");

var salt = '1234';
var passphrase = '1234';
var keySize = 16; // bytes
var iterationCount = 1000;

crypto.pbkdf2(passphrase, new Buffer(salt), iterationCount, keySize, 'sha1', function(err, key) {
    console.log(key.toString('hex'));
});

输出为:ed5b67e667fa6bca73e1ec21dddda358

为什么输出不同?我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

最终他们给出了不同的输出,因为你给了他们不同的输入。

您的Java输出与

的结果匹配
PBKDF2[HMACSHA1](UTF8("1234"), HEX("1234"), 1000, 16)

您的node.js输出与

的结果匹配
PBKDF2[HMACSHA1](UTF8("1234"), UTF8("1234"), 1000, 16)

不同之处在于您的Java中的盐是{ 0x12, 0x34 },而node.js中的盐是{ 0x31, 0x32, 0x33, 0x34 }

大概你想要new Buffer(salt, 'hex')(或者,从that constructor is deprecated开始,Buffer.from(salt, 'hex'))。