NodeJS Crypto 抛出“错误:错误:1C80006B:提供程序例程::错误的最终块长度”

NodeJS Crypto throws "Error: error:1C80006B:Provider routines::wrong final block length"

提问人:Jeshuwa Bradley 提问时间:11/15/2023 更新时间:11/15/2023 访问量:50

问:

我正在运行一个 MERN 应用程序,其中存储了加密的用户数据。检索数据时,应解密数据。 这是我用于加密和解密数据的代码

const crypto = require('crypto')

const { SECRET_KEY, SECRET_IV, ENCRYPTION_METHOD } = process.env

if (!SECRET_KEY || !SECRET_IV || !ENCRYPTION_METHOD) {
    throw new Error('secretKey, secretIV, and ecnryptionMethod are required')
}

// Generate secret hash with crypto to use for encryption
const key = crypto
    .createHash('sha512')
    .update(SECRET_KEY)
    .digest('hex')
    .substring(0, 32)
const encryptionIV = crypto
    .createHash('sha512')
    .update(SECRET_IV)
    .digest('hex')
    .substring(0, 16)


// Encrypt data
const encryptData = (data) => {
    const cipher = crypto.createCipheriv(ENCRYPTION_METHOD, key, encryptionIV)
    return Buffer.from(
        cipher.update(data, 'utf8', 'hex') + cipher.final('hex')
    ).toString('base64') // Encrypts data and converts to hex and base64
}

// Decrypt data
const decryptData = (encryptedData) => {
    try {
        const buff = Buffer.from(encryptedData, 'base64')
        const decipher = crypto.createDecipheriv(ENCRYPTION_METHOD, key, encryptionIV)
        const decrypted = decipher.update(buff.toString("utf8"), 'base64', 'utf8') + decipher.final('utf8');
        return decrypted;
    } catch (error) {
        console.error('Decryption Error:', error);
        return null;
    }
}

当我尝试解密时,出现以下错误

Decryption Error: Error: error:1C80006B:Provider routines::wrong final block length
    at Decipheriv.final (node:internal/crypto/cipher:193:29)
    at decryptData (C:\Users\jeshu\Desktop\pizzahub\middleWare\encrypt.js:35:95)
    at C:\Users\jeshu\Desktop\pizzahub\controllers\orderController.js:101:30  
    at Array.forEach (<anonymous>)
    at findOrderForShop (C:\Users\jeshu\Desktop\pizzahub\controllers\orderController.js:100:16)
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {   
  library: 'Provider routines',
  reason: 'wrong final block length',
  code: 'ERR_OSSL_WRONG_FINAL_BLOCK_LENGTH'
}

我该怎么办

JavaScript 节点 .js 加密 mern

评论

3赞 Topaco 11/15/2023
加密期间的编码(十六进制 + Base64)和解密期间的解码(2 x Base64)是不同的,要使其工作,解码必须符合编码。编码/解码两次也是没有意义的。删除加密期间的十六进制编码和解密期间多余的 Base64 解码。
2赞 Topaco 11/15/2023
此外,该代码还存在一些漏洞:使用快速摘要作为密钥派生函数,使用十六进制编码的字符串作为密钥,静态 IV,...

答: 暂无答案