javascript 如何使用Webcrypto API生成私钥/公钥对并使用私钥对数据进行签名?

pdkcd3nj  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(193)

我想对数据进行签名,返回签名和公钥(并“忘记”私钥)API

根据这些文档,我从以下内容开始

const generateKeyPair = async function() {
    return crypto.subtle.generateKey(
        {
            name: "ECDSA",
            namedCurve: "P-384",
        },
        true,
        ["sign", "verify"]
    );
}

const sign = async function(privateKey: CryptoKey, buffer: BufferSource) {
    return crypto.subtle.sign(privateKey.algorithm, privateKey, buffer);
}

根据我的测试,我认为函数generateKeyPair是好的。但是当我像这样尝试sign函数时

import { describe, it, expect } from "vitest";
import { generateKeyPair, sign } from "../../src";

describe("sign", () => {
    it('returns a signature.', async () => {
        const { privateKey } = await generateKeyPair();

        const data = { foo: 'bar' };
        const stringifiedData = JSON.stringify(data);
        const buffer = Buffer.from(stringifiedData);

        await expect(sign(privateKey, buffer)).resolves.toBeTruthy() // expect signature here
    });
});

测试失败,出现错误
错误:promise rejected“TypeError [ERR_MISSING_OPTION]:算法.hash是必需的”而不是解析
所以我猜privateKey.algorithm缺少内部的hash字段。我是不是用错了算法?我还试着把"hash": "SHA-512"添加到generateKeyPair中的选项中。
我基本上想生成一个密钥对,并使用私有密钥对进行签名,使用公共密钥对进行阅读。
你有什么主意吗?

3xiyfsfu

3xiyfsfu1#

您需要指定要使用的签名算法的名称和散列。在ECDSA签名的情况下,您需要将EcdsaParams对象传递给sign()函数:

const sign = async function(privateKey: CryptoKey, buffer: BufferSource) {
    return crypto.subtle.sign({
      name: 'ECDSA',
      hash: 'SHA-512'
    }, privateKey, buffer);
};

Playground链接

相关问题