如何迁移使用哈希加密的Firebase密码?
实现方案
分两个阶段平滑迁移,完全不影响现有用户访问权限,同时逐步落地客户端哈希加密逻辑:
第一阶段:兼容原有明文传输逻辑,新增客户端哈希可选支持
- 客户端新增加密逻辑:使用服务端下发的盐值+原始密码做哈希计算(可选用SHA-256或和Firebase内部一致的scrypt算法,不需要和Firebase的哈希规则对齐),把哈希结果和原始明文密码同时随登录请求传给服务端
- 服务端做兼容判断:如果请求携带客户端哈希结果,就先把哈希值存到自有用户库对应用户的字段中;如果未携带,直接走原有逻辑,把明文密码转发给Firebase的
https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword接口做校验即可 - 这个阶段所有用户登录不受任何影响,活跃用户登录时会逐步在你的数据库中积累客户端哈希后的密码记录
第二阶段:全量切换到客户端哈希逻辑,废弃明文密码传输
- 等覆盖绝大多数活跃用户(或等所有用户至少完成一次登录后),就可以修改服务端主逻辑:所有登录请求只需要传客户端哈希后的密码值,服务端直接把这个哈希结果当作普通明文密码转发给Firebase的signInWithPassword接口即可完成校验
- 针对长时间未登录的冷用户,第一次登录时走过渡兼容逻辑:客户端同时传原始密码的哈希值和明文,服务端先拿明文去Firebase校验,校验通过后直接调用Firebase的updatePassword接口,把用户的Firebase侧密码更新为客户端哈希后的结果,后续该用户再登录就可以直接走哈希校验逻辑,不需要再传明文
- 全量上线后客户端不再传输明文密码,所有传输的都是加盐哈希后的结果,满足安全要求
注意事项
- 盐值可以设计成全局公共盐+用户唯一标识(如邮箱、用户UID)的组合,每个用户的盐独立,安全性更高;盐值不要硬编码在客户端代码里,用户输入账号后先通过预校验接口拉取对应用户的盐值即可
- 不需要找Firebase的哈希密码专用上传接口,Firebase本身会对传入的
password字段做内部加盐哈希存储,你把客户端哈希后的结果当作普通密码传入现有接口即可,完全兼容原有调用逻辑 - 迁移过程可加灰度开关,先给小比例用户开启客户端哈希逻辑,验证登录成功率无异常后再逐步全量
内容的提问来源于stack exchange,提问作者Irina Rapoport
相关产品推荐
相关产品推荐

