使用 node.js 加密验证签名

WeC*_*nds 5 digital-signature public-key-encryption node.js

我正在尝试使用 AWS lambda 快速验证使用 sec256r1 创建的签名。

消息:“一些要签名的文本”

也用 sha256 进行了哈希处理

签名将采用 base64

encoding:MEYCIQCPfWhpzxMqu3gZWflBm5V0aetgb2/S+SGyGcElaOjgdgIhALaD4lbxVwa8HUUBFOLz+CGvIioDkf9oihSnXHCqh8yV
Run Code Online (Sandbox Code Playgroud)

公钥看起来像这样:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXIvPbzLjaPLd8jgiv1TL/X8PXpJN
gDkGRj9U9Lcx1yKURpQFVavcMkfWyO8r7JlZNMax0JKfLZUM1IePRjHlFw==
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

澄清,

我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)

Men*_*ris 13

以下是如何与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
}
Run Code Online (Sandbox Code Playgroud)

此后,要验证签名,您可以使用以下函数:

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;
}
Run Code Online (Sandbox Code Playgroud)

getSignatureVerifyResult将根据签名是否验证返回 true/false。请记住,在签名时有多种算法可供选择。


jar*_*mod 4

请参阅此 StackOverflow 帖子中更完整的解决方案,其中展示了如何在 node.js 中使用verify.update()verify.verify()方法。