如何在客户端获取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
相关产品推荐
相关产品推荐

