从 base64 解密为 utf-8 时,crypto decipher 返回未知字符

crypto decipher returning unknown characters when deciphering from base64 to utf-8

我正在为具有两个功能的环境变量构建一个 encryption/decryption 模块

  1. 加密 .env 的内容并将其写入 encrypted.env
  2. 解密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 附加到密文,然后在解密器中读取它来做到这一点。但无论如何他们必须是相同的。