Jetpack Compose中Android Keystore加密的跨用户解密与密钥恢复问题
问题解决方案
场景1:跨用户解密资料的业内方案
针对Sue进入Bob/Mike地理围栏后对方无法解密资料的问题,常用落地方案如下:
- ECDH临时密钥交换:触发地理围栏通知时,Sue与Bob/Mike通过Firebase实时数据库的安全通道交换临时ECDH公钥,双方本地生成共享对称密钥。Sue用该密钥加密需共享的资料片段(或加密一个对称数据密钥,再用它加密完整资料),将加密内容发送给对方,对方用共享密钥解密即可查看。这种方式无需共享长期密钥,安全性高,适配临时授权场景。
- 数据密钥+接收方公钥包装:Sue用对称数据密钥加密个人资料,当需要授权Bob/Mike查看时,将数据密钥分别用Bob和Mike的公钥加密(密钥包装),存入数据库对应权限节点。Bob/Mike触发权限后,用自身私钥解密得到数据密钥,再解密资料。配合Firebase安全规则,仅允许地理围栏内用户访问对应加密数据密钥,实现权限管控。
- 组密钥机制:预先创建地理围栏对应的组密钥,用户进入围栏时自动加入组。Sue用组密钥加密资料片段,组内成员均可解密。组密钥可定期轮换,进一步提升安全性。
场景2:设备更换/数据清除后的密钥恢复
解决密钥丢失导致无法解密历史资料的问题,核心是安全备份密钥或采用分层密钥架构:
- 分层密钥架构:采用"主密钥+数据密钥"两层结构。主密钥由用户PIN/密码或生物特征派生(仅在内存中生成,不存储),数据密钥用于加密实际资料,并用主密钥加密后与资料一同存入数据库。更换设备或清除数据后,用户验证身份重新派生主密钥,解密数据密钥即可恢复历史资料。
- 加密密钥备份:生成密钥对时,将私钥用用户PIN/密码加密后,通过Android BackupManager或Firebase云存储备份。更换设备时,用户验证身份后下载加密私钥,解密后导入新设备的Android KeyStore。备份全程需加密,避免密钥泄露。
- 可导出密钥的安全托管:若使用不可导出的KeyStore密钥,可额外生成一个可导出的备份密钥对,用主密钥(用户身份派生)加密私钥后存储。恢复时,先派生主密钥解密备份私钥,再用备份私钥解密历史资料。
内容的提问来源于stack exchange,提问作者Lazza
相关产品推荐
相关产品推荐

