为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕莱坞森 2023-09-07 17:05:34
我可以毫无问题地签署和验证测试文件gpg,但通过 OpenGPG.js 验证签名失败,并出现错误“消息摘要不匹配”。为什么是这样?$ gpg --armor --quiet --batch --yes --detach-sig index.html$ gpg --verify index.html.asc index.htmlgpg: Signature made Wed 25 Nov 2020 08:26:34 PM PSTgpg:                using RSA key C361FDC3F93B9E8F8BD7E08D5F873051B2D6C347gpg: 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' }
查看完整描述

1 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

总而言之,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);

    });

...


查看完整回答
反对 回复 2023-09-07
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信