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

时间:2018-03-09 13:22:32

标签: javascript node.js encryption

我尝试在浏览器上使用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');

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

当您使用错误的key时,通常会发生错误。

您开始使用不同的包。 crypto-js将使用您的密码,创建密钥并加密secret中的明文。 创建Decipher时crypto也会这样做,但是存在填充问题。简而言之,key在解密时crypto并不相同。

使用像abcabcabc1abcabcabc1abcabcabc132

这样的32字节密钥

进行客户端加密,例如:

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,将会更容易。

希望它有所帮助!