b/w Node.js 和 Java 中的差异 b/w PBKDF2 实现
Difference b/w PBKDF2 implementation in Node.js and Java
我正在尝试实现一个 Java 代码,它在 Node.js 中生成一个 PBDKF2 密钥,但两种情况下的结果都不同。
这是 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
为什么输出不同?我在这里错过了什么?
最终他们会给出不同的输出,因为你给了他们不同的输入。
您的 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')
)。
我正在尝试实现一个 Java 代码,它在 Node.js 中生成一个 PBDKF2 密钥,但两种情况下的结果都不同。 这是 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
为什么输出不同?我在这里错过了什么?
最终他们会给出不同的输出,因为你给了他们不同的输入。
您的 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')
)。