Node.js 使用openssl从加密模块解密文件
我有一个用例,我们使用一个简单的NodeJS应用程序将日志数据流式传输到一个文件中。我们希望能够在传输数据时对这些数据进行加密,然后根据需要使用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
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