nodejsencryption解密有什么问题?

我有以下encryption的数据:

U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o

解密它的password是: password

(这是来自乱码的例子)

在使用openssl的命令行中:

echo "U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o" | openssl enc -d -aes-256-cbc -a -k password

输出是:

Made with Gibberish\n

用我的NodeJS应用程序:

  var decipher = crypto.createDecipher('aes-256-cbc', "password"); var dec = decipher.update("U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o", 'base64', 'utf8'); dec += decipher.final('utf8'); 

我有以下错误TypeError: DecipherFinal faildecipher.finalTypeError: DecipherFinal fail

我错过了什么吗? 谢谢。

encryption的数据以8字节“魔术”开始,表示有盐。 接下来的8个字节就是盐。 现在,坏消息是:Node.js似乎没有使用salt作为EVP_BytesToKey方法:

 int key_len = EVP_BytesToKey(cipher, EVP_md5(), NULL, (unsigned char*) key_buf, key_buf_len, 1, key, iv); 

NULL是盐。

这已经使用Javatesting应用程序(使用正确的salt)进行了validation – 返回了结果string。

请使用OpenSSL -nosalt开关-nosalt盐,然后重试。

[例]

OpenSSL CLI:

 openssl enc -aes-256-cbc -nosalt -a -k password owlstead Mh5yxIyZH+fSMTkSgkLa5w== 

NodeJSencryption:

 var crypto=require('crypto') var cipher=crypto.createDecipher('aes-256-cbc', "password") var enc = cipher.update("Mh5yxIyZH+fSMTkSgkLa5w==", 'base64', 'utf8') enc += cipher.final('utf8') 

[编辑]请注意,使用秘密密钥推导与盐和大的工作因素可能是安全至关重要的。 你最好使用一个非常独特的高熵密码,否则你的encryption数据可能会有风险。


[真正的延迟编辑] OpenSSL 1.1.0c改变了一些内部组件使用的摘要algorithm 。 以前使用MD5,1.1.0切换到SHA256。 在EVP_BytesToKey和像openssl enc这样的命令中,注意这个改变不会影响到你。

Interesting Posts