将 nodejs 数据加密到 mysql

Encrypt nodejs data to mysql

我目前正在使用 Crypto 来加密/解密数据,但是,如果服务器重新启动,解密将不再有效。这就是我目前正在使用的 =>

const crypto = require("crypto");
const algorithm = "aes-256-cbc"; 
const initVector = crypto.randomBytes(16);
const Securitykey = crypto.randomBytes(32);

function encrypt(text){
    const cipher = crypto.createCipheriv(algorithm, Securitykey, initVector);
    let encryptedData = cipher.update(text, "utf-8", "hex");
    encryptedData += cipher.final("hex");
    return encryptedData;
}

function decrypt(text){
    const decipher = crypto.createDecipheriv(algorithm, Securitykey, initVector);
    let decryptedData = decipher.update(text, "hex", "utf-8");
    decryptedData += decipher.final("utf8");
    return decryptedData;
}

如果我想在服务器重启后解密某些东西,这就是我得到的错误

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

因此,正如我从代码中看到的那样,您的 IV 和密钥是随机生成的,我假设您没有将它们保存在任何地方。

const initVector = crypto.randomBytes(16);
const Securitykey = crypto.randomBytes(32);

所以基本上在服务器重启时你会得到一对新的 IV 和密钥,所以当你解密时它与加密时使用的密钥和 IV 不匹配。

我建议的解决方案:

const crypto = require("crypto");
const algorithm = "aes-256-cbc"; 
const initVectorString = "Any random hex string of 16bytes"; // You can store this into a env file
const SecuritykeyString = "Random security hex string of 32bytes"; // You can store this into a env file
const initVector = Buffer.from(initVectorString, "hex");  
const Securitykey = Buffer.from(SecurityKeyString, "hex");

function encrypt(text){
    const cipher = crypto.createCipheriv(algorithm, Securitykey, initVector);
    let encryptedData = cipher.update(text, "utf-8", "hex");
    encryptedData += cipher.final("hex");
    return encryptedData;
}

function decrypt(text){
    const decipher = crypto.createDecipheriv(algorithm, Securitykey, initVector);
    let decryptedData = decipher.update(text, "hex", "utf-8");
    decryptedData += decipher.final("utf8");
    return decryptedData;
}

更新:-

因此,如果您为 IV 使用 utf-8 字符串,则字符串长度应仅为 16 个字符(如果您仅使用 1 字节字符 a-zA-Z0-9 均为 1 字节字符)并且您需要将 Buffer.from() 函数中的编码类型从“Hex”更改为“utf-8”。

类似于字符串的安全密钥长度应仅为 32 个字符,您需要将 Buffer.from() 函数中的编码类型从“Hex”更改为“utf-8”。