数字信封例程:Bad Decrypt

Digital Envelope Routines: Bad Decrypt

我正在前端加密 object 并发送带有加密数据的 HTTP POST 请求。在后端,我试图解密这个对象,但它失败了。

测试通过,但当集成到实际项目中时,此 decrypt 方法失败并出现错误:

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt at Error (native) at Decipher.final (crypto.js:158:26) at Object.exports.decrypt.error [as decrypt]

相关代码如下:

export const decrypt = text => {
  if (!text)
    throw Error('Decrypt: Text may not be blank');
  const decipher = crypto.createDecipher(encryptAlgorithm, 
  encryptionKey)
  let decrypted = decipher.update(text, textEncodingHex, 
  textEncodingUtf8)
  decrypted += decipher.final(textEncodingUtf8)
  return decrypted
}

这就是我的使用方式

authSignInWeb(): any {
  return async (request: any, reply: any) => {
    try {
      let decrytedRequestPayload = request.payload;
      if (process.env.REACT_APP_ENCRYPT) {
        decrytedRequestPayload = JSON.parse(cryptoHelper.decrypt(request.payload))
      }
      ...
    } catch (error) {
       reply(error);
      ...
    }
  };
};

在查阅文档和其他在线资源后,我设法解决了这个问题。失败的原因是 HapiJs 获取传入的有效负载,对其进行解析,并将其作为 Javascript 对象传递给 authSignInWeb(),实际有效负载作为它代表我创建的对象中的键。

为了解决这个问题,我不得不在前端加密数据,手动创建一个对象并分配加密信息。然后在后端访问对象的payload键。

在代码中:

前端是这样的:

let encryptedData = {};
if (process.env.REACT_APP_ENCRYPT) {
  encryptedData.data = Crypt.encrypt(JSON.stringify(requestBody))
}

然后在后端(在 authSignInWeb() 内)执行:

 let userAuthData = request.payload;
 if (process.env.REACT_APP_ENCRYPT) {
   userAuthData = JSON.parse(cryptoHelper.decrypt(userAuthData.data))
 }