You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在客户端获取Passkey私钥?SvelteKit技术求助

关于Passkey私钥获取的问题解答

核心结论

你无法从startRegistration或startAuthentication的返回结果中获取到私钥,这是WebAuthn(Passkey的底层标准)的安全设计决定。

原因说明

WebAuthn的核心安全模型就是将私钥托管在浏览器的安全执行环境(如Chrome安全模块、设备TPM、Touch ID/Face ID等)中,严格禁止JavaScript直接访问私钥。私钥只会在内部用于签名服务器下发的挑战,整个过程对前端代码完全透明,目的是避免私钥被恶意脚本窃取,保障身份认证的安全性。

针对simplewebauthn库的具体说明

使用simplewebauthn/browser的startRegistration返回的AttestationResponse对象,仅包含公钥、凭证ID、签名等用于服务器验证注册合法性的数据;startAuthentication返回的AssertionResponse也只有签名结果和相关验证信息,两者都不会暴露私钥。你示例代码中的somehowGetPrivateKey()不存在可行的实现方式。

替代方案(满足客户端加密需求)

如果你需要在客户端加密数据,建议采用以下方式:

  • 单独使用Web Crypto API生成独立的非对称密钥对(或对称密钥),专门用于数据加密,和Passkey的身份认证密钥分开使用。示例代码:
// 生成用于加密的非对称密钥对
const encryptionKeyPair = await window.crypto.subtle.generateKey(
  {
    name: "RSA-OAEP",
    modulusLength: 2048,
    publicExponent: new Uint8Array([1, 0, 1]),
    hash: "SHA-256",
  },
  true, // 密钥是否可提取
  ["encrypt", "decrypt"]
);
// 可提取公钥用于传输,私钥留在客户端用于解密
const publicKey = await window.crypto.subtle.exportKey("spki", encryptionKeyPair.publicKey);
  • 若要将加密密钥与Passkey绑定,可以在Passkey注册成功后,用Passkey签名你生成的加密密钥的公钥,将签名结果和加密密钥一起存储在客户端(如IndexedDB)。后续使用加密密钥前,可通过Passkey签名验证密钥的合法性,确保未被篡改。

内容的提问来源于stack exchange,提问作者standard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:32:08