gpt4 book ai didi

javascript - 使用 Ed25519 KeyPair 对 JWS(json web 签名)进行签名和验证

转载 作者:行者123 更新时间:2023-12-04 17:16:28 29 4
gpt4 key购买 nike

我想在客户端设备上使用通过 Ed25519 生成的私钥签署 JWS(json Web 签名)。然后将此签名发送到我的后端并使用公钥进行验证。
为了熟悉该过程,我想尝试在 Node js 中签名和验证 JWS。
我的私钥和公钥都已经生成并且在 base58 中可用。这是我目前使用 Ed25519 私钥签署 JWT 的尝试:

const { SignJWT } = require("jose/jwt/sign");
const bs50 = require("bs58");

async function main() {
const publicBase58 = "A77GCUCZ7FAuXVMKtwwXyFhMa158XsaoGKHYNnJ1q3pv";
const privateKeyBase58 = "BE1VM7rTRJReLsTLLG4JMNX5ozcp7qpmMuRht9zB1UjU";

const publicKeyBuffer = bs50.decode(publicBase58);
const privateKeyBuffer = bs50.decode(privateKeyBase58);

const publicKey = new Uint8Array(publicKeyBuffer);
const privateKey = new Uint8Array(privateKeyBuffer);

const jwt = await new SignJWT({
subject: "uuid",
})
.setProtectedHeader({ alg: "EdDSA" })
.setExpirationTime("2h")
.sign(privateKey);

console.log(jwt);
}
错误:TypeError: key 必须是 KeyObject 或 CryptoKey 类型之一。收到了一个 Uint8Array 的实例
尝试使用 sign() 时函数我收到上面的错误,因为我的 privateKey 是 Uint8Array 类型, 唯一接受的类型是 KeyObjectCryptoKey但我不知道如何将 Uint8Arrays 转换为 KeyObjectsCryptoKeys .
我从这个 answer 得到了一些代码片段

最佳答案

您需要采用 Node.js 识别的格式的 key 。 KeyObject create*Key APIs 识别并且 key 支持 - 对于 Ed25519 key ,即假设 Node.js >= 16.0.0:

  • SPKI 中用于公钥的 PEM/DER
  • PKCS8 中用于私钥的 PEM/DER
  • 公钥和私钥的 JWK

  • 这是一个使用 DER 的片段。
    import { SignJWT, jwtVerify } from "jose"
    import bs58 from "bs58"
    import { createPrivateKey, createPublicKey } from "crypto"

    (async function main() {
    const publicBase58 = "A77GCUCZ7FAuXVMKtwwXyFhMa158XsaoGKHYNnJ1q3pv";
    const privateKeyBase58 = "BE1VM7rTRJReLsTLLG4JMNX5ozcp7qpmMuRht9zB1UjU";

    let publicKey = bs58.decode(publicBase58);
    let privateKey = bs58.decode(privateKeyBase58);

    publicKey = createPublicKey({
    key: Buffer.concat([Buffer.from("302a300506032b6570032100", "hex"), publicKey]),
    format: "der",
    type: "spki",
    });

    privateKey = createPrivateKey({
    key: Buffer.concat([
    Buffer.from("302e020100300506032b657004220420", "hex"),
    privateKey,
    ]),
    format: "der",
    type: "pkcs8",
    })

    const jwt = await new SignJWT({
    subject: "uuid",
    })
    .setProtectedHeader({ alg: "EdDSA" })
    .setExpirationTime("2h")
    .sign(privateKey);

    console.log(await jwtVerify(jwt, publicKey))
    })()
    这是一个使用 JWK 的。
    import { SignJWT, jwtVerify } from "jose"
    import bs58 from "bs58"
    import { createPrivateKey, createPublicKey } from "crypto"

    (async function main() {
    const publicBase58 = "A77GCUCZ7FAuXVMKtwwXyFhMa158XsaoGKHYNnJ1q3pv";
    const privateKeyBase58 = "BE1VM7rTRJReLsTLLG4JMNX5ozcp7qpmMuRht9zB1UjU";

    let publicKey = bs58.decode(publicBase58);
    let privateKey = bs58.decode(privateKeyBase58);

    publicKey = createPublicKey({
    key: {
    kty: "OKP",
    crv: "Ed25519",
    x: publicKey.toString("base64url")
    },
    format: "jwk"
    });

    privateKey = createPrivateKey({
    key: {
    kty: "OKP",
    crv: "Ed25519",
    x: publicKey.toString("base64url"),
    d: privateKey.toString("base64url"),
    },
    format: "jwk"
    })

    const jwt = await new SignJWT({
    subject: "uuid",
    })
    .setProtectedHeader({ alg: "EdDSA" })
    .setExpirationTime("2h")
    .sign(privateKey);

    console.log(await jwtVerify(jwt, publicKey))
    })()

    关于javascript - 使用 Ed25519 KeyPair 对 JWS(json web 签名)进行签名和验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68612396/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com