数字信封例程:坏解密

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字信封例程:坏解密相关的知识,希望对你有一定的参考价值。

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

测试正在通过但是当集成到实际项目时,这个decrypt方法失败并出现错误:

错误:错误:06065064:数字信封例程:EVP_DecryptFinal_ex:在Decipher.final(crypto.js:158:26)处于错误(本机)时在Object.exports.decrypt.error处解密[解密]

这是相关代码:

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(),其中实际有效负载作为代表我的对象的关键。

为了解决这个问题,我必须在前端加密数据,手动创建一个对象并分配加密信息。然后在后端访问对象的有效负载密钥。

在代码中:

前端是这样的:

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

以上是关于数字信封例程:坏解密的主要内容,如果未能解决你的问题,请参考以下文章

一句话总结数字签名数字证书数字信封

[转]RSA数字签名与数字信封

数字信封工作原理

数字信封工作原理

使用 node.js 解密 AES256 返回错误的最终块长度

电子病历系统安全性-加密解密