为什么验证分离签名会导致 OpenPGP.js 出现“消息摘要不匹配”错误?

我可以毫无问题地签署和验证测试文件gpg,但通过 OpenGPG.js 验证签名失败,并出现错误“消息摘要不匹配”。为什么是这样?


$ gpg --armor --quiet --batch --yes --detach-sig index.html

$ gpg --verify index.html.asc index.html

gpg: Signature made Wed 25 Nov 2020 08:26:34 PM PST

gpg:                using RSA key C361FDC3F93B9E8F8BD7E08D5F873051B2D6C347

gpg: Good signature from <key>

$ node sandbox.js 

{ signatures:

   [ { keyid: [Keyid],

       verified: [Promise],

       signature: [Signature],

       valid: false,

       error:

        Error: Message digest did not match

            at Signature.verify (/home/caleb/src/islands/node_modules/openpgp/dist/openpgp.js:41176:11)

            at process._tickCallback (internal/process/next_tick.js:68:7)

            at Function.Module.runMain (internal/modules/cjs/loader.js:834:11)

            at startup (internal/bootstrap/node.js:283:19)

            at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3) } ],

  data: 'Test!\n' }


慕莱坞森
浏览 107回答 1
1回答

qq_遁去的一_1

总而言之,gpg 的默认操作模式在签名时使用非文本模式,而 OpenPGP.js 似乎默认为文本模式(至少以此处使用的方式)。添加--textmode到 gpg 命令行允许 OpenPGP.js 验证签名,从而解决问题。如果不需要文本模式,也可以从文件中读取二进制数据:...    let msg_data = fs.readFileSync(path + "index.html", null);    let sig_data = fs.readFileSync(path + "index.html.sig", null);    let pubkey_data = fs.readFileSync(path + "pubkey.asc", 'utf8');    let msg = await openpgp.message.fromBinary(msg_data);    let sig = await openpgp.signature.read(sig_data);    let pubkey = await openpgp.key.readArmored(pubkey_data);    openpgp.verify({        message: msg,        signature: sig,        publicKeys: pubkey.keys    }).then(function(verified) {        console.log(verified);    });...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript