数据库泄露场景下多用户身份别名的匿名性保护方案咨询
可行的存储方案设计
核心原则是彻底消除user文档和alias文档之间可被直接匹配的关联字段,即使攻击者拿到全量数据库数据,也没有任何依据可以把某一个alias和对应的所属user绑定,具体实现如下:
- 首先删除user文档内所有和alias相关的明文关联字段,原来的
aliasIds列表完全移除,user文档仅存储登录必备的基础信息(邮箱、登录密码哈希等),全程不记录该用户创建过的任何alias标识:
// 调整后的user文档结构 user123: { email: 'foo@bar.com', passwordHash: "xxx登录密码哈希值", // 无任何alias相关字段 }
- 每个alias文档增加独立的鉴权字段,创建alias时生成非对称密钥对,公钥直接存在alias文档中作为操作校验依据,私钥仅在创建成功时返回给用户端,由用户本地存储:
// 调整后的alias文档结构 MikeMain: { aliasPubKey: "xxx非对称加密公钥", name: 'Mike', catchPhrase: 'Always remain hydrated' }
用户后续对该alias的所有操作请求,都需要用对应的私钥签名,服务端仅需用alias文档内存储的公钥验签通过即可执行操作,全程不需要识别该请求对应的用户身份,自然也不需要存储alias和user的关联关系。
- 如果担心用户本地丢失alias私钥无法找回,可以做两个可选的兼容方案:
- 让用户为每个alias设置独立的恢复密码,用恢复密码的哈希值加密alias私钥后,存到和user表完全隔离的alias密钥备份表中,备份记录不包含任何用户身份信息,用户只有输入正确的恢复密码才能解密拿回私钥
- 兼顾易用性的方案:用户登录时用输入的明文密码做KDF派生一个独立的加密密钥,把用户所有alias的私钥加密成一串密文后存在user文档中,就算数据库泄露,攻击者没有用户的明文登录密码,也无法解密密文得到alias私钥,自然无法完成关联。
内容的提问来源于stack exchange,提问作者Josh M.
相关产品推荐
相关产品推荐

