基于WebAuthn在移动端Safari实现客户端敏感数据存取的方案咨询
纯客户端移动端Safari WebAuthn敏感数据存储方案
WebAuthn本质是身份验证协议,并非通用加密存储方案,原生不支持直接存储自定义敏感数据(私钥仅存于设备安全元件,不可访问或导出)。针对你的需求(纯客户端、依赖iOS生物识别、Safari环境),可以通过以下变通方案实现:
方案1:利用WebAuthn的userHandle字段存储加密数据
WebAuthn注册凭证时可指定userHandle字段,该字段会由设备安全存储,后续获取凭证时可读取。结合加密实现敏感数据存储:
- 步骤:
- 用Web Crypto API生成随机AES对称密钥,加密你的敏感数据(注意数据大小,Safari对
userHandle的长度限制约为几KB,过大数据不适用)。 - 调用WebAuthn注册接口时,将**加密后的敏感数据(转成Uint8Array或Base64格式)**传入
userHandle参数。 - 后续需读取数据时,调用WebAuthn获取凭证接口,完成生物识别验证后,从返回结果中提取
userHandle,再用AES密钥解密数据。
- 用Web Crypto API生成随机AES对称密钥,加密你的敏感数据(注意数据大小,Safari对
- 优化点:避免明文存储AES密钥,可将AES密钥通过WebAuthn凭证ID(获取凭证时可拿到)作为种子,用PBKDF2算法派生得到,无需额外存储密钥。
- 限制:仅适用于小体积敏感数据;
userHandle可被浏览器读取,必须加密后存储。
方案2:WebAuthn + Web Crypto + 客户端存储(IndexedDB)
用WebAuthn做生物识别身份校验,Web Crypto处理加密,IndexedDB存储加密后的数据,实现"生物识别解锁解密密钥"的逻辑:
- 步骤:
- 注册WebAuthn凭证,获取凭证ID和公钥。
- 生成随机AES密钥,加密敏感数据后存入IndexedDB。
- 生成随机挑战字符串,调用WebAuthn签名接口完成生物识别验证,将签名结果作为"解锁因子"存储(可存在IndexedDB)。
- 读取数据时,重新生成相同挑战,请求WebAuthn签名,对比两次签名结果(或用签名哈希值派生解密密钥),验证通过后用AES密钥解密数据。
- 优势:支持更大体积的敏感数据;数据存储在IndexedDB,比依赖
userHandle更灵活。 - 限制:需要自行实现密钥派生、签名验证和加密逻辑,代码复杂度较高;需确保挑战的唯一性和安全性。
关键注意事项(Safari环境)
- 必须在HTTPS环境下运行(本地开发可使用
localhost)。 - 需iOS 13.3及以上版本,该版本开始Safari完整支持WebAuthn。
- WebAuthn的
userHandle在Safari中不可为空,注册时必须指定有效值。
内容的提问来源于stack exchange,提问作者Anters Bear
相关产品推荐
相关产品推荐

