如何验证用户写入的PGP公钥?



我正在尝试验证表单中的PGP公钥输入。

我知道公共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;
}

但它是一个非常原始的验证器。也许有一些库可以验证公共PGP密钥。或者,也许您知道其他一些指示PGP公钥有效的规则。

充其量,您的方法只能验证公钥的架构,而不能验证密钥本身。例如,如果您知道所有有效的公钥都由 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-----

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

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

最新更新