将 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”。
我目前正在使用 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”。