可直接用 window.crypto.subtle.generatekey() 生成密钥对并导出为标准 jwk 格式,全程在浏览器内存中完成;推荐 ecdsa(p-256)或 rsa-pkcs#1 v1.5/pss 算法,ecdsa 更轻量高效,rsa 更通用但开销大。

可以直接用 window.crypto.subtle.generateKey() 生成密钥对,再用 exportKey("jwk", key) 导出为标准 JWK 格式,整个过程在浏览器内存中完成,无需离开客户端。
选对算法和参数是关键
签名场景推荐使用 ECDSA(椭圆曲线)或 RSA-PKCS#1 v1.5 / RSA-PSS。ECDSA 更轻量、速度快,适合前端高频签名;RSA 更通用,但密钥体积大、运算慢。
-
ECDSA(推荐):用
"ECDSA"+"P-256"(最广泛兼容)或"P-384";密钥用途设为["sign", "verify"] -
RSA 签名:用
"RSASSA-PKCS1-v1_5"或"RSA-PSS",模长至少 2048 位,publicExponent常用new Uint8Array([1, 0, 1]),哈希选"SHA-256"
生成并导出 JWK 的完整代码
以下以 P-256 ECDSA 为例,生成后立即导出公私钥的 JWK:
const keyPair = await crypto.subtle.generateKey(
{ name: "ECDSA", namedCurve: "P-256" },
true,
["sign", "verify"]
);
const publicKeyJWK = await crypto.subtle.exportKey("jwk", keyPair.publicKey);
const privateKeyJWK = await crypto.subtle.exportKey("jwk", keyPair.privateKey);
console.log("Public Key (JWK):", publicKeyJWK);
console.log("Private Key (JWK):", privateKeyJWK);
return { publicKeyJWK, privateKeyJWK };
}
generateAndExportJWK();
JWK 输出符合标准,可直接用于 JWT 签名
导出的 JWK 是纯 JSON 对象,含 kty、crv、x、y(EC)或 n、e(RSA)等字段,已按 RFC 7517 规范 Base64url 编码,无需额外处理就能传给 JWT 库(如 jsrsasign 或自定义签名逻辑)。
- ECDSA 的 JWK 中
x和y是压缩坐标,长度固定(P-256 对应 32 字节),Base64url 编码后可直接拼入 JWT Header.Payload.Signature 流程 - 若需长期存储私钥 JWK,务必注意:JWK 默认不加密——敏感场景下应配合密码派生(PBKDF2)+ AES-GCM 加密该 JWK,否则不能存本地磁盘或 localStorage
签名时直接用导入的 JWK 密钥
后续签名时,可用 importKey("jwk", jwkObj, ...) 将 JWK 重新载入 CryptoKey 对象,再调用 sign():
"jwk",
privateKeyJWK,
{ name: "ECDSA", namedCurve: "P-256" },
true,
["sign"]
);
const signature = await crypto.subtle.sign(
{ name: "ECDSA", hash: "SHA-256" },
key,
new TextEncoder().encode("data to sign")
);
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











