代码之家  ›  专栏  ›  技术社区  ›  Nicolas Bouvrette

sha256带node forge的摘要签名

  •  1
  • Nicolas Bouvrette  · 技术社区  · 6 年前

    我正在构建一个node.js acmev2客户机,并试图仅依赖一个加密库来保持代码的简单性。本机节点加密模块不支持CSR,因此我必须使用 Node-Forge . 到目前为止,一切都正常,但我很难使用node forge找到等效代码:

    const crypto = require('crypto');
    const signer = crypto.createSign('RSA-SHA256').update(`${requestBase64Url.protected}.${requestBase64Url.payload}`, 'utf8');
    const signature = signer.sign(this.keys.accountKey.privatePem, 'base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
    console.log(signature);
    

    输出是:

    oZpJuZlNgU48t8l-39V1LUZScOPHTFzHDWYT6ttf1KBGnm6jNuGkogwc0QiANrt5h5z6mp0Wz3rPz7etxjby_znQsGuaGdxvtVDf30_6j0mN-Rh7OXkS489JK6kDSQRbhpoyulb75QZyhDoA2pbmqyPc6HnfnQ2gUGr8HZf3K_LnfXCAX807MAzXd_bOx2dE0NbnwoVQQgGG1u5s7Q9-DY1WNjolYmkTt_skNoXgbAKZwj-8x6oSbfGk5_7-mbuEXcxUAJuXmGQsHrHAp7lKBZ9ZhTyZUlZjEhfRYb7cMYHSAJccalMPC5y5uzrIQYILhGtuDcXBsY1rCanJw6eRqg

    我还可以使用以下openssl(并将结果编码为base64url)实现相同的输出:

    openssl dgst -sha256 -sign account.key -out signature.sha256 signature.b64
    

    如何使用 结点锻造 模块?我没有任何运气就尝试了以下方法:

    let messageDigest = forge.md.sha256.create();
    messageDigest.update(`${requestBase64Url.protected}.${requestBase64Url.payload}`, 'utf8');
    const accountKey = await forge.pki.privateKeyFromPem(this.keys.accountKey.privatePem);
    request.signature = accountKey.sign(messageDigest);
    

    输出是:

    wqHCmknCucKZTcKBTjzCt8OJfsOfw5V1LUZScMOjw4dMXMOHDWYTw6rDm1_DlMKgRsKebsKjNsOhwqTCogwcw5EIwoA2wrt5wofCnMO6wprCnRbDj3rDj8OPwrfCrcOGNsOyw785w5DCsGvCmhnDnG_CtVDDn8OfT8O6wo9Jwo3DuRh7OXkSw6PDj0krwqkDSQRbwobCmjLCulbDu8OlBnLChDoAw5rClsOmwqsjw5zDqHnDn8KdDcKgUGrDvB3Cl8O3K8Oyw6d9cMKAX8ONOzAMw5d3w7bDjsOHZ0TDkMOWw6fDgsKFUEIBwobDlsOubMOtD34Nwo1WNjolYmkTwrfDuyQ2wOxdogwwwwwwwwwqosbcoxwqttp8o-w77cmck7字w4xuamkbwpfcmgqsshskxw4dcp8k5sgxcn1nchtzcmvjwyxw5fhwr7dndhcgcosamkxhgptdwvcnmk5wrs6w4hbwoilworrbg3dhcobwhcjwqndicodwqfcckq

    1 回复  |  直到 6 年前
        1
  •  1
  •   Nicolas Bouvrette    6 年前

    我找到答案是因为:

    1. https://github.com/digitalbazaar/forge/issues/647
    2. https://repl.it/repls/RipeLatestOctal

    基本上,forge将签名编码为二进制字符串,必须使用以下代码对其进行解码:

    request.signature = Buffer.from(forge.util.binary.raw.decode(accountKey.sign(messageDigest)));