我正在尝试验证表单中的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端口在客户端或服务器端全部解决此问题,但是如果您打算使用此端口来积极地加密和解密文件,我强烈建议您将此服务器完成侧。

10-08 13:38