如何使用 JavaScript 在浏览器中加密数据并使用 Node.js 在服务器端解密

Posted

技术标签:

【中文标题】如何使用 JavaScript 在浏览器中加密数据并使用 Node.js 在服务器端解密【英文标题】:How to encrypt data in browser with JavaScript and decrypt on server side with Node.js 【发布时间】:2018-03-09 13:22:31 【问题描述】:

我正在尝试在浏览器上使用 AES256 加密消息,将其发送到服务器,然后对其进行解密,但我一直在服务器端收到此错误:

error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

我尝试了几个小时来寻找解决方案,但我看不出问题出在哪里。我将crypto-js 用于客户端,将标准库用于Node.js crypto

这是我在客户端使用的代码示例。

import * as CryptoJS from 'crypto-js';

const secret = 'example';
const passphrase = 'secret-passphrase'

const encrypted = CryptoJS.AES.encrypt(secret, passphrase);
const encrypted64 = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);

// make a request to a Node.js API with the password encrypted

这是我在服务器端使用的代码示例。

const crypto = require('crypto');

const secret = req.body.secret;

const passphrase = 'secret-passphrase'
const decipher = crypto.createDecipher('aes256', passphrase);

let decrypted = decipher.update(secret, 'base64', 'utf8');
decrypted += decipher.final('utf8');

有什么想法吗?

谢谢。

【问题讨论】:

你不能用https吗? 正如@James 所写,如果您通过 HTTPS 运行您的网站,则所有流量都已加密,并且使用 letencrypt 发布免费证书,没有真正的理由使用 HTTP @James 我已经在使用HTTPS 协议了。 那你为什么想要额外的加密呢?它并没有真正使任何事情更安全 @Luca 我明白,你是对的。我可以依赖 HTTPS。据我个人所知,您对这个问题有什么想法吗? 【参考方案1】:

使用 HTTPS 将在传输过程中加密有效负载,并在服务器上对其进行解密。 HTTPS 使用 RSA 加密消息加密中使用的密钥。 RSA 使用难以破解的 1024 位密钥值。黑客必须将大量数字分解为它们的原始质数才能获得几乎不可能破解的密钥。

通常建议在传输中使用 HTTPS。

【讨论】:

【参考方案2】:

一般使用错误key会出现该错误。

您一开始就使用不同的软件包。 crypto-js 将获取您的密码,创建一个密钥并加密您在secret 中拥有的明文。 crypto 在您创建 Decipher 时也会这样做,但是会出现填充问题。简而言之,keycrypto在解密时是不一样的。

使用 32 字节的密钥,例如 abcabcabc1abcabcabc1abcabcabc132

进行客户端加密,例如:

var ciphertext= C.AES.encrypt(secret, C.enc.Hex.parse(passphrase),  mode: C.mode.ECB, padding: C.pad.NoPadding ).ciphertext.toString();

然后在您的服务器端代码执行以下操作(在将相同的密码传递给 decipher 之后):

let decrypted = decipher.update(ciphertext, 'hex', 'utf8');

试一试。它应该工作。如果在客户端和服务器上都使用crypto-js 会更容易。

希望对你有帮助!

【讨论】:

以上是关于如何使用 JavaScript 在浏览器中加密数据并使用 Node.js 在服务器端解密的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript - 如何在 2020 年仅使用密码加密字符串? [复制]

记录-JavaScript常规加密技术

219-如何对密码进行加密?

219-如何对密码进行加密?

【前端】常用加密方法

C#如何解密用javascript中encodeURIComponent函数加密过的数据