我在javascript / nodejs中有以下代码来加密密码。我需要在java中读取这些密码:
encryptPassword: function(password, salt) {
var salt = new Buffer(salt, 'base64');
return crypto.pbkdf2Sync(password, salt, 10000, 64).toString('base64');
}
我使用此方法创建加密密码以进行测试。这是结果(作为java变量):
static String password = "123456";
static String salt = "CPvFo+klD9Vh2iE07JEGXA==";
public final String encrypted = "LtStqkNQjrr+P4V8fGtnauNJNOIB7t35O5I4a4/I9lFUnMR3ckbZyT85g/wO0Da9318Wrql/y1bsY2XdpXqx+Q==";
我尝试将上面的加密代码转换为java,使用此http://www.javacodegeeks.com/2012/05/secure-password-storage-donts-dos-and.html:
public static byte[] getEncryptedPassword(String password, byte[] salt)
throws NoSuchAlgorithmException, InvalidKeySpecException {
String algorithm = "PBKDF2WithHmacSHA1";
int derivedKeyLength = 64;
int iterations = 10000;
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations, derivedKeyLength);
SecretKeyFactory f = SecretKeyFactory.getInstance(algorithm);
return f.generateSecret(spec).getEncoded();
}
最后,我使用apache编解码器来设置基于64的字符串:
public static String getEncryptedPassword(String password, String salt) throws NoSuchAlgorithmException, InvalidKeySpecException
{
byte[] bytes = Base64.decodeBase64(salt);
byte[] encryptedPassword = getEncryptedPassword(password, bytes);
return Base64.encodeBase64String(encryptedPassword);
}
测试人员是这样的:
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException {
System.out.println(encrypted);
System.out.println(getEncryptedPassword(password, salt));
}
输出
LtStqkNQjrr + P4V8fGtnauNJNOIB7t35O5I4a4 / I9lFUnMR3ckbZyT85g / wO0Da9318Wrql / y1bsY2XdpXqx + Q ==
LtStqkNQjro =
正如您所看到的,java代码产生的东西几乎是javascript生成的加密密码的前缀。 我在不同的复杂密码上测试了这个,并得到了相同的结果:一个字符串,它是javascript加密密码的前缀。不同的密码不是彼此的前缀。
因此,我认为我非常接近。但我无法弄清楚缺少什么。