Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中读取加密密码_Java_Node.js_Encryption_Passwords - Fatal编程技术网

在Java中读取加密密码

在Java中读取加密密码,java,node.js,encryption,passwords,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变量): 我尝试使

我在javascript/nodejs中有以下加密密码的代码。我需要用java读取这些密码:

encryptPassword: function(password, salt) {
    var salt = new Buffer(salt, 'base64');
    return crypto.pbkdf2Sync(password, salt, 10000, 64).toString('base64');
}
我使用此方法创建加密密码进行测试。这是结果(作为java变量):

我尝试使用以下方法将上述加密代码转换为java:

最后,我使用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加密密码的前缀。不同的密码不是彼此的前缀


因此,我认为我非常接近。但是我不知道缺少了什么。

您确定Node的“crypto.pbkdf2Sync”与Java的“PBKDF2WithHmacSHA1”(尤其是WithHmacSHA1部分)的算法相同吗?我不是这些算法的专家,但Java版本似乎做了一些散列,因此结果的长度更短
keydlength
参数
PBEKeySpec
似乎以位为单位指定密钥大小。js库中类似参数的单位是什么?字节?我想是的。从文档():“PBKDF2应用伪随机函数HMAC-SHA1…”@OlegEstekhin我不确定。java文档或javascript文档中未指定单位。因此,我假设它与位/字节无关,而是与密钥长度(不是特定于语言的术语)有关。docs:java-,byte[],int,int)javascript-您应该已经检查了当您在js中指定64,在java中指定512时会发生什么。第一个base64值是64字节,而第二个是8字节(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));       
}