使用node.js加密模块验证签名

13

我正在尝试使用AWS Lambda在Swift中验证使用sec256r1创建的签名。

消息:"some text to sign"

也已使用SHA256进行哈希处理

签名将以base64格式呈现

encoding:MEYCIQCPfWhpzxMqu3gZWflBm5V0aetgb2/S+SGyGcElaOjgdgIhALaD4lbxVwa8HUUBFOLz+CGvIioDkf9oihSnXHCqh8yV

公钥将会长成这样:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXIvPbzLjaPLd8jgiv1TL/X8PXpJN
gDkGRj9U9Lcx1yKURpQFVavcMkfWyO8r7JlZNMax0JKfLZUM1IePRjHlFw==
-----END PUBLIC KEY-----

为了澄清,我正在尝试使用lambda来验证来自客户端的签名,并在需要时使用其公钥加密数据。

以下是代码:

    const crypto = require('crypto');
    const verify = crypto.createVerify('SHA256');

    verify.write('some text to sign');
    verify.end();

    const l1 = "-----BEGIN PUBLIC KEY-----\n"
    const l2 = 
  "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXIvPbzLjaPLd8jgiv1TL/X8PXpJNgDkGRj9U9Lcx1yKURpQFVavcMkfWyO8r7JlZNMax0JKfLZUM1IePRjHlFw=="

    const l3 = "\n-----END PUBLIC KEY-----"

    const publicKey = l1 + l2 + l3

    const signature = "MEYCIQCPfWhpzxMqu3gZWflBm5V0aetgb2/S+SGyGcElaOjgdgIhALaD4lbxVwa8HUUBFOLz+CGvIioDkf9oihSnXHCqh8yV";

    console.log(verify.verify(publicKey, signature));// Prints: true or false

你有什么问题吗?请编辑问题并说明你需要什么帮助。 - Jason Aller
我正在尝试使用lambda来验证我生成的签名。 - WeCanBeFriends
您在尝试使用lambda验证签名时遇到了什么问题?您尝试过什么?是否有代码可以提供上下文信息? - Jason Aller
听起来你的问题是如何正确使用Python加密API,而不是Lambda特定的问题。你能在Lambda之外让这段代码正常工作吗? - jarmod
看看这个能否帮助你在node.js中解决问题:https://dev59.com/Zl8f5IYBdhLWcg3wHfo_ - jarmod
显示剩余3条评论
2个回答

12
这是如何与Nodejs.Crypto集成的方法。首先,需要生成RSA私钥和公钥。有几种方法可以做到这一点,以下是一种使用encrypt.JS在线生成的方法。在私钥和公钥已存储到文件系统后,可以使用下面的getSignatureByInput函数生成给定字符串输入的唯一签名:
const crypto = require('crypto')
const fs = require('fs')

const getSignatureByInput = (input) => {
  let privatePem = fs.readFileSync('PRIVATE_KEY_FILE_PATH_GOES_HERE')
  let key = privatePem.toString('ascii')
  let sign = crypto.createSign('RSA-SHA256')
  sign.update(input)
  let signature = sign.sign(key, 'hex')

  return signature
}

接下来,要验证签名,您可以使用以下函数:

const getSignatureVerifyResult = (input) => {
        let signatureSignedByPrivateKey = getSignatureByInput(input)

        let pem = fs.readFileSync('PUBLIC_KEY_FILE_PATH_GOES_HERE')
        let publicKey = pem.toString('ascii')
        const verifier = crypto.createVerify('RSA-SHA256')

        verifier.update(input, 'ascii')

        const publicKeyBuf = new Buffer(publicKey, 'ascii')
        const signatureBuf = new Buffer(signatureSignedByPrivateKey, 'hex')
        const result = verifier.verify(publicKeyBuf, signatureBuf)

        return result;
}

getSignatureVerifyResult会返回true/false,具体取决于签名是否经过验证。请记住,在签名时有大量算法可供选择


1
正是我所寻找的。 - Saksham Khurana

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接