从 base64 解密为 utf-8 时,crypto decipher 返回未知字符
crypto decipher returning unknown characters when deciphering from base64 to utf-8
我正在为具有两个功能的环境变量构建一个 encryption/decryption 模块
- 加密 .env 的内容并将其写入 encrypted.env
- 解密encrypted.env的内容并将其写入.env
我运行遇到一个问题,解密后 .env 的第一行是未知字符。
.env 的原始内容
STAGE="DEVELOPMENT"
USERNAME="Greggo"
PASSWORD="myPassw0rd?1234"
encrypted.env:
PEGeGD40pJoLBN2cQvFgPm/KrWxMakRkKkhbUlzQdsNF8zrmr0w5dUsEVINRfXPPM23W8No8HF5uCzqRCMG98g5MHDZkHpXE1s4/cevGTv0=
解密.env:
�~#�A��YHQ��//NT"
USERNAME="Greggo"
PASSWORD="myPassw0rd?1234"
encrypt.js
fs.readFile('./.env', 'utf-8', (err, data) => {
if (err) {
throw err;
}
console.log(data);
crypto.scrypt('glfgmkjldpg90d9gd88k3kfs;fsdl;f99sfFKkdl;dlda', 'salt', 24, (err, key) => {
if (err) {
throw err;
}
crypto.randomFill(new Uint8Array(16), (err, iv) => {
if (err) {
throw err;
}
const cipher = crypto.createCipheriv('aes-192-cbc', key, iv);
let encrypted = cipher.update(data, 'utf-8', 'base64');
encrypted += cipher.final('base64');
console.log(encrypted);
fs.writeFile('./encrypted.env', encrypted, (err, data) => {
if (err) {
throw err;
}
console.log(data);
});
});
})
});
decrypt.js
fs.readFile('./encrypted.env', 'utf-8', (err, encryptedData) => {
if (err) {
throw err;
}
console.log(encryptedData);
const key = crypto.scryptSync('glfgmkjldpg90d9gd88k3kfs;fsdl;f99sfFKkdl;dlda', 'salt', SALT_ROUNDS);
const iv = Buffer.alloc(16, 0);
const decipher = crypto.createDecipheriv('aes-192-cbc', key, iv);
let decrypted = decipher.update(encryptedData, 'base64', 'utf-8');
decrypted += decipher.final('utf-8');
console.log(decrypted);
fs.writeFile('./.env', decrypted, (err, decryptedData) => {
if (err) {
throw err;
}
console.log(decryptedData);
});
});
你的加密器有一个随机 IV,由 randomFill
生成,但你似乎把它扔掉了。您的解密代码会创建一个充满零的 IV。您的 IV 需要相同。通常,您会通过在加密器中将随机生成的 IV 附加到密文,然后在解密器中读取它来做到这一点。但无论如何他们必须是相同的。
我正在为具有两个功能的环境变量构建一个 encryption/decryption 模块
- 加密 .env 的内容并将其写入 encrypted.env
- 解密encrypted.env的内容并将其写入.env
我运行遇到一个问题,解密后 .env 的第一行是未知字符。
.env 的原始内容
STAGE="DEVELOPMENT"
USERNAME="Greggo"
PASSWORD="myPassw0rd?1234"
encrypted.env:
PEGeGD40pJoLBN2cQvFgPm/KrWxMakRkKkhbUlzQdsNF8zrmr0w5dUsEVINRfXPPM23W8No8HF5uCzqRCMG98g5MHDZkHpXE1s4/cevGTv0=
解密.env:
�~#�A��YHQ��//NT"
USERNAME="Greggo"
PASSWORD="myPassw0rd?1234"
encrypt.js
fs.readFile('./.env', 'utf-8', (err, data) => {
if (err) {
throw err;
}
console.log(data);
crypto.scrypt('glfgmkjldpg90d9gd88k3kfs;fsdl;f99sfFKkdl;dlda', 'salt', 24, (err, key) => {
if (err) {
throw err;
}
crypto.randomFill(new Uint8Array(16), (err, iv) => {
if (err) {
throw err;
}
const cipher = crypto.createCipheriv('aes-192-cbc', key, iv);
let encrypted = cipher.update(data, 'utf-8', 'base64');
encrypted += cipher.final('base64');
console.log(encrypted);
fs.writeFile('./encrypted.env', encrypted, (err, data) => {
if (err) {
throw err;
}
console.log(data);
});
});
})
});
decrypt.js
fs.readFile('./encrypted.env', 'utf-8', (err, encryptedData) => {
if (err) {
throw err;
}
console.log(encryptedData);
const key = crypto.scryptSync('glfgmkjldpg90d9gd88k3kfs;fsdl;f99sfFKkdl;dlda', 'salt', SALT_ROUNDS);
const iv = Buffer.alloc(16, 0);
const decipher = crypto.createDecipheriv('aes-192-cbc', key, iv);
let decrypted = decipher.update(encryptedData, 'base64', 'utf-8');
decrypted += decipher.final('utf-8');
console.log(decrypted);
fs.writeFile('./.env', decrypted, (err, decryptedData) => {
if (err) {
throw err;
}
console.log(decryptedData);
});
});
你的加密器有一个随机 IV,由 randomFill
生成,但你似乎把它扔掉了。您的解密代码会创建一个充满零的 IV。您的 IV 需要相同。通常,您会通过在加密器中将随机生成的 IV 附加到密文,然后在解密器中读取它来做到这一点。但无论如何他们必须是相同的。