nodejs加密解密有什么问题?

San*_*nda 16 openssl cryptography aes node.js

我有以下加密数据:

U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o

解密它的传递是: 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');
Run Code Online (Sandbox Code Playgroud)

TypeError: DecipherFinal fail在这decipher.final行有以下错误.

我错过了什么吗?谢谢.

Maa*_*wes 15

加密数据以8字节"魔术"开始,表示存在盐(ASCII编码"Salted__").然后接下来的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);
Run Code Online (Sandbox Code Playgroud)

NULL是盐.

这已经使用Java测试应用程序(使用正确的盐)进行了验证 - 返回了结果字符串.

请使用OpenSSL -nosalt开关省略盐,然后重试.

[例]

OpenSSL CLI:

openssl enc -aes-256-cbc -nosalt -a -k password
owlstead
Mh5yxIyZH+fSMTkSgkLa5w==
Run Code Online (Sandbox Code Playgroud)

NodeJS加密:

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

[LATE EDIT]请注意,使用带有盐和大工作因子的密钥派生对于安全性可能是最重要的.您最好使用非常独特的高熵密码,否则您的加密数据可能会有风险.


[真的很晚编辑] OpenSSL 1.1.0c改变了一些内部组件中使用的摘要算法.以前使用MD5,1.1.0切换到SHA256.请注意,更改不会影响您EVP_BytesToKey和命令openssl enc.

  • 如何使用-nosalt选项加密节点加密? (2认同)

归档时间:

查看次数:

6738 次

最近记录:

7 年,7 月 前