如何验证用户编写的 PGP public 密钥?

How to validate PGP public key written by a user?

我正在尝试验证表单中的 PGP public 键输入。

我知道 public PGP 密钥以 -----BEGIN PGP PUBLIC KEY BLOCK----- 开头并以 -----END PGP PUBLIC KEY BLOCK----- 结尾。所以我创建了验证函数 isValidPublicPGP.

function isValidPublicPGP(pubKey) {
    if (!pubKey.startsWith("-----BEGIN PGP PUBLIC KEY BLOCK-----")) {
        return false;
    }
    if (!pubKey.endsWith("-----END PGP PUBLIC KEY BLOCK-----")) {
        return false;
    }
    return true;
}

但它是一个非常原始的验证器。也许有一些库可以验证 public PGP 密钥。或者您可能知道一些其他规则表明 PGP public 密钥有效。

充其量,您的方法只能验证 public 密钥的架构,而不是密钥本身。例如,如果您知道所有有效的 public 键都由 56 个字母数字字符组成,并被页眉和页脚包围

-----BEGIN PGP PUBLIC KEY BLOCK-----

-----END PGP PUBLIC KEY BLOCK-----

您可能想调用以下一个像样的验证函数

function validatePGP(key) {
    return !!key.match(/^(-----BEGIN PGP PUBLIC KEY BLOCK-----)\s?\w{56}\s?(-----END PGP PUBLIC KEY BLOCK-----)$/)
}

这将正确验证密钥是否遵循定义的架构,但这并不意味着密钥有效,只是它可能有效。没有什么可以阻止我输入这样的密钥

-----BEGIN PGP PUBLIC KEY BLOCK-----
thisisnotavalidkeybutthereisnowayforyoutoknowthatisthere
-----END PGP PUBLIC KEY BLOCK-----

该函数会验证这一点并说它是一个好的密钥,但显然情况并非如此。验证此密钥的正确方法是计算其签名并将该签名与已知密钥服务器上的官方密钥或由该密钥签名的已知软件进行比较。如果它们匹配,则您拥有未被篡改的有效密钥。

这都可以通过 openpgp 端口到从 npm 下载的 javscript 的客户端或服务器端处理,但是如果您要使用它来主动加密和解密文件,我强烈建议这在服务器端完成。