Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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
Node.js 使用openssl从加密模块解密文件_Node.js_Openssl_Cryptography_Cryptojs - Fatal编程技术网

Node.js 使用openssl从加密模块解密文件

Node.js 使用openssl从加密模块解密文件,node.js,openssl,cryptography,cryptojs,Node.js,Openssl,Cryptography,Cryptojs,我有一个用例,我们使用一个简单的NodeJS应用程序将日志数据流式传输到一个文件中。我们希望能够在传输数据时对这些数据进行加密,然后根据需要使用OpenSSL或类似工具对其进行解密 我们正在做的基本工作如下: var crypto = require('crypto'), algorithm = 'aes256', password = 'password'; var fs = require('fs'); var Readable = require('st

我有一个用例,我们使用一个简单的NodeJS应用程序将日志数据流式传输到一个文件中。我们希望能够在传输数据时对这些数据进行加密,然后根据需要使用OpenSSL或类似工具对其进行解密

我们正在做的基本工作如下:

var crypto = require('crypto'),
        algorithm = 'aes256',
        password = 'password';

var fs = require('fs');

var Readable = require('stream').Readable

var r = new Readable
r.push('This is a test')
r.push(null)

var encrypt = crypto.createCipher(algorithm, password);
var decrypt = crypto.createDecipher(algorithm, password)

var w = fs.createWriteStream('file.out');

//Write encrypted stream to file. Decrypt with openssl fails with 'bad magic number'
r.pipe(encrypt).pipe(w)
//Decrypt using cipher library. Decrypted text displays as expected
//r.pipe(encrypt).pipe(decrypt).pipe(w)
假设我们只是在读取数据时对数据进行加密,我会假设我们可以使用OpenSSL对其进行解密,例如

openssl enc -d -aes256 -in file.out -out file.out.decrypted
但这只是给了我一个错误

Bad magic number

任何帮助都将不胜感激。

默认情况下,OpenSSL加密文件格式以8字节的“幻数”开头,即US-ASCII编码的
“Salted\uuuu”
。然后是另一个8字节的值,该值与密码一起散列,以派生消息的加密密钥和IV。您的NodeJS代码没有以相同的方式派生密钥或提供必要的头,因此无法工作


OpenSSL的密钥派生算法是不安全和非标准的。如果您自己使用良好的密钥派生算法(如PBKDF2)从密码派生密钥(或者更好的是随机选择密钥),则可以使用
-K
选项将密钥(以十六进制编码)提供给
enc
命令,同时使用
-IV
选项提供给IV。我还没有检查您是否也需要
-nosalt
选项,以避免对本例中的神奇数字提出投诉。

查看该函数的文档,它提到OpenSSL函数用于从密码短语派生密钥,就像应用程序一样。因此,这似乎是兼容的

然而,同样的文档没有提到应用了任何salt,并且函数似乎也不可能将salt作为参数传入。因此,您必须将
-nosalt
选项传递到
openssl enc
以使其正常工作,如下所示:

openssl enc -d -aes256 -nosalt -in file.out -out file.out.decrypted
您可以通过使用
openssl enc
工具来模拟正在发生的情况,无论是否希望解密端出现salt:

你目前的情况:

$ echo -n 'This is a test' | openssl enc -aes256 -nosalt -pass pass:password | openssl enc -d -aes256 -pass pass:password
bad magic number
解密时添加
-nosalt

$ echo -n 'This is a test' | openssl enc -aes256 -nosalt -pass pass:password | openssl enc -d -aes256 -nosalt -pass pass:password
This is a test