用Java读取加密密码

时间:2014-07-08 14:14:29

标签: java node.js encryption passwords

我在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加密密码的前缀。不同的密码不是彼此的前缀。

因此,我认为我非常接近。但我无法弄清楚缺少什么。

0 个答案:

没有答案