使用私钥编码的 NOdeJs Rest API 响应

分享于2022年07月17日 api node.js pgp private-key rest 问答
【问题标题】:使用私钥编码的 NOdeJs Rest API 响应(NOdeJs Rest API response encoded with private key)
【发布时间】:2022-01-26 01:23:10
【问题描述】:

我已经获得了在 nodejs 中调用 restAPI 的公钥和私钥。 两个键都是清晰的 ASCII 格式。

我使用以下代码来加密我的消息:


(async () => {
    // put keys in backtick (``) to avoid errors caused by spaces or tabs

    // ENCRYPT

    const publicKeyArmored = fs.readFileSync(publicKeyFile, {
      encoding: 'utf8',
      flag: 'r'
    });
    
    const publicKey = await openpgp.readKey({ armoredKey: publicKeyArmored });

    const encrypted = await openpgp.encrypt({
        message: await openpgp.createMessage({ text: 'Hello, World!' })
    ,   encryptionKeys: publicKey
    // ,        signingKeys: privateKey // optional
    });
    
    console.log("Encrypted:", encrypted); // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
}

但是,当我尝试解密响应时,我发现的所有代码示例似乎都需要密码才能使用提供的私钥,但这并没有以任何方式编码,它还是纯 ascii,以:

-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)

lQO+BGHApmABCAC70QG0T3bh1MVRGKmY9cOM2NFEie2KXCLGXUPa+2B5JOnDypGX
msoLau8FtKIqvAVAYSsONlE4P4RcltyrOTHLMvWhu73ZTJIBu6GGkgM6bKOtu2Rp
/VbPylPIXrkA3A4s0089VGgmFqJul04lit2svLwxD31ZEIY3Ke3kd0dV0nM4npRO
EZUPR5Qr6KCwBsL+ZHbDuG2YrC7oKcnJTXcdszrF7+FLAwI8viZhJOXyagJRioXd
/H/IpauXyvejN22/eRjch9IRMSz+qh0avj9tcuuJ1k4sBQQukeoIoPwFe9Rb9TY2 .....

以下代码表明我需要密码,但此密钥似乎不需要密码:


async function decrypt() {
  const privateKey = (await openpgp.key.readArmored([privateKeyArmored])).keys[0];
  await privateKey.decrypt(passphrase);

  const encryptedData = fs.readFileSync("encrypted-secrets.txt");
  const decrypted = await openpgp.decrypt({
    message: await openpgp.message.readArmored(encryptedData),
    privateKeys: [privateKey],
  });

  console.log(decrypted.data);
}

那么我如何在没有密码的情况下使用它?

提前感谢您的圣诞精神和任何帮助!


【解决方案1】:

您的私钥是 ASCII armored ,因此可以以文本表示形式传输它。调用 gpg --dearmor 后,您将获得二进制数据。也可以使用密码加密存储私钥,或者根本不加密(在第二种情况下,您不需要调用 privateKey.decrypt() )。要检查这一点,您可以使用命令 gpg --list-packets keyfile.asc