基于FastAPI的密码管理器API架构求助:加密数据库与密钥管理
密码管理器API架构方案
核心思路
让客户端持有主密码派生的加密密钥,服务器仅负责身份验证和密文存储,全程不接触任何明文敏感信息,同时兼顾API操作的便捷性。
具体实现步骤
1. 登录与密钥派生流程
- 客户端先请求目标用户的盐值(服务器从users表取出返回,盐值需和主密码哈希一起存在users表)
- 客户端本地用「主密码+盐值」通过PBKDF2/Argon2算法派生加密密钥(和服务器端之前用的派生规则完全一致)
- 客户端将用户名、主密码的哈希值(同样用盐值计算)发给服务器,服务器验证哈希匹配后,返回仅包含用户ID、过期时间的JWT(无任何敏感信息)
- 密钥全程留在客户端,服务器自始至终不碰明文主密码和派生密钥
2. API操作逻辑
- 查询凭据:客户端携带JWT和目标服务标识(如网站域名)请求服务器,服务器返回该用户对应服务的密文数据,客户端本地解密后展示
- 新增/更新凭据:客户端本地用密钥加密新的凭据内容,携带JWT、服务标识、加密后的密文提交给服务器,服务器直接写入/更新services表(无需解密)
- 删除凭据:客户端携带JWT和服务标识请求服务器,服务器直接删除对应密文记录
3. 安全与体验优化细节
- JWT设置较短的过期时间(如15分钟),同时返回刷新令牌,用户无需频繁输入主密码即可续期会话
- 客户端密钥存储要做安全处理:浏览器用Web Crypto API限制密钥用途,桌面端调用系统密钥链(Windows凭据管理器、macOS钥匙串)存储密钥
- 服务器端的users表必须存储加盐后的主密码哈希,禁止存储明文或无盐哈希
方案优势
- 彻底规避服务器存储敏感密钥的安全风险
- 无需将整个services表传回客户端,单次API仅交互单个服务数据,操作高效便捷
- 每个用户的凭据用独立密钥加密,完全符合你拒绝单密钥架构的要求
内容的提问来源于stack exchange,提问作者FTG
相关产品推荐
相关产品推荐

