首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >nodejs加密解密有什么问题?

nodejs加密解密有什么问题?
EN

Stack Overflow用户
提问于 2012-09-01 00:49:01
回答 1查看 8.1K关注 0票数 16

我有以下加密数据:

U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o

解密它的方法是:password

(这是来自gibberish-aes的示例)

在使用openssl的命令行中:

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

输出为:

Made with Gibberish\n

使用我的NodeJS应用程序:

代码语言:javascript
复制
  var decipher = crypto.createDecipher('aes-256-cbc', "password");
  var dec = decipher.update("U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o",
     'base64', 'utf8');
  dec += decipher.final('utf8');

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

我是不是漏掉了什么?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-12 06:10:55

加密的数据以一个8字节的“魔术”开头,表示有一个盐("Salted__"的ASCII码)。然后接下来的8个字节是盐。现在坏消息是: Node.js似乎没有为EVP_BytesToKey方法使用盐:

代码语言:javascript
复制
int key_len = EVP_BytesToKey(cipher, EVP_md5(), NULL,
  (unsigned char*) key_buf, key_buf_len, 1, key, iv);

那个NULL就是盐。

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

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

示例

OpenSSL命令行界面:

代码语言:javascript
复制
openssl enc -aes-256-cbc -nosalt -a -k password
owlstead
Mh5yxIyZH+fSMTkSgkLa5w==

NodeJS加密:

代码语言:javascript
复制
var crypto=require('crypto')
var cipher=crypto.createDecipher('aes-256-cbc', "password")
var enc = cipher.update("Mh5yxIyZH+fSMTkSgkLa5w==", 'base64', 'utf8')
enc += cipher.final('utf8')

后期编辑请注意,使用具有盐和较大功因数的密钥推导可能对安全性至关重要。你最好使用一个非常独特的,高熵的密码,否则你的加密数据可能会有风险。

在某些内部组件中使用的REALLY LATE EDIT。以前使用的是MD5,1.1.0版本切换到了SHA256。请注意,更改不会同时影响EVP_BytesToKeyopenssl enc等命令。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12219499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档