当前位置: 首页 > 面试题库 >

Node.js加密解密有什么问题?

乜栋
2023-03-14
问题内容

我有以下加密数据:

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');

TypeError: DecipherFinal faildecipher.final一行中遇到以下错误。

我想念什么吗?谢谢。


问题答案:

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

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

NULL是盐。

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

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

[例]

OpenSSL CLI:

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

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')

[最新编辑]请注意,使用带有盐和较大工作因子的秘密密钥派生对安全性至关重要。您最好使用非常独特的高熵密码,否则您的加密数据可能会受到威胁。

请[稍后编辑] OpenSSL1.1.0c更改了某些内部组件中使用的摘要算法。以前使用MD5,并且1.1.0切换到SHA256。请注意,更改不会同时影响您EVP_BytesToKey和命令opensslenc



 类似资料:
  • 问题内容: 我一直在寻找一个解决方案,并在Node.js服务器和Objective-C客户端上进行加密,反之亦然,使用AES(或其他合适的方法)进行搜索 我对密码学还比较陌生,因此我无法理解为什么每种语言的加密文本都不同。 这是我到目前为止的内容: 使用此CryptoJS库的 Node.js加密方法 -node-cryptojs-aes 使用AESCrypt库的 Objective-C加密方法 多

  • 我正在使用pkcs7加密解密在当前的项目。我想从PHP改为Node.js。node.js中有pkcs7加密/解密吗? 在PHP中, 解密 node.js中有类似这样的功能吗?

  • 我当前在解密服务器上的RSA加密数据时遇到了问题,服务器使用Node.js并使用node-rsa库进行加密/解密。 在我的Android客户端上没有任何问题地接收到公钥,但是当尝试解密数据时,我得到了以下异常: 这就是我在客户端上生成公钥的方式 以下是客户端的加密:

  • 我的Arduino板上有以下代码: 它可以加密和解密,我在串行下一个输出: njf 00 xnz 92 nvczkexeuhkg = = < br >解密:123456789 但问题是,如果我使用在线工具进行解密https://www.devglan.com/online-tools/aes-encryption-decryption,键1234567891234567、IV 7654321987

  • 问题内容: 我们正在使用bcrypt来存储不需要解密的密码和数据。 应该采取什么措施来保护其他这样做的用户信息。对于此示例,假设我们不希望用户的真实姓名采用纯文本格式,以防有人获取数据库。 这是一些敏感数据,但还需要不时调用并以纯文本显示。有没有简单的方法可以做到这一点? 问题答案: 您可以使用crypto模块: 编辑 现在 createCipher 和 createDecipher 已被弃用,而

  • 接下来,我使用java用接收到的公钥加密字符串,因此我将pkcs8公钥解析为java PublicKey对象。 并用它加密文本 它运行良好,并返回一个Base64编码的加密字符串,如下所示 未捕获的错误:解密时出错(可能是密钥不正确)。原始错误:错误:错误解码消息,从提供的标签计算出的lHash和加密数据中的lHash不匹配。(…)然而,我已经测试过,如果我只在javascript中加密和解密文本