[我正在一个项目中,该项目具有Java中的手动密码哈希,并且负责在NodeJS中复制哈希方案,以防止用户不得不重置其密码。
我似乎无法编写一个散列函数来生成与旧代码生成的密钥相同的密钥。
我已经深入研究了每个实现的内部结构,并且发现了一个关键的区别,即NodeJS版本以字节为单位测量keyLength,而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问题都集中在其他一些次要问题上,因此我对此感到茫然。
import java.util.Base64;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
public static String hash(byte[] salt, String password) throws Exception {
SecretKeyFactory pbkdf2 = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 128);
byte[] secret = pbkdf2.generateSecret(spec).getEncoded();
return Base64.getEncoder().encodeToString(secret);
}
这可以运行为:
String base64_salt = "oFoz+aZuGX5Ad/HAa35HLw==";
byte[] salt = Base64.getDecoder().decode(base64_salt);
System.out.println(hash(salt, "13111789"));
给我:On7VbkKDXdz8aTWo5tDBXw==
等效的JS代码为:
const crypto = require("crypto"); function hash(salt, password) { const key = crypto.pbkdf2Sync(password, salt, 65536, 16, "sha1"); return key.toString("base64"); }
可以运行为:
const base64_salt = "oFoz+aZuGX5Ad/HAa35HLw==";
const salt = Buffer.from(base64_salt, "base64");
console.log(hash(salt, "13111789"));
也给我:On7VbkKDXdz8aTWo5tDBXw==