基于Local-Only Encryption Model的跨设备密码管理工具实现方案咨询
实现Local-Only Encryption Model的核心思路与技术指引
先直接解答你的核心疑问:LastPass的Local-Only Encryption Model确实是服务器端不存储任何AES解密所需的密钥、IV或能推导密钥的敏感信息,服务器只负责存储加密后的密码库数据、一些辅助性的非敏感元数据(比如用于密钥推导的盐——这个盐本身不具备解密能力),所有加解密逻辑100%在客户端完成。
多设备同步解密的核心原理
你困惑的“电脑端加密后移动端怎么解密”,关键在于用户的主密码(Master Password)是所有密钥的唯一根源,具体流程是这样的:
- 用户首次注册时,客户端(比如你的React前端)会生成两个随机盐:
- Master Salt:用于结合主密码通过KDF(密钥派生函数)生成真正的AES加密密钥(Master Key)
- Login Salt:用于生成登录验证用的密钥(避免主密码直接传输到服务器)
- 客户端用主密码+Master Salt通过强KDF(比如Argon2id,安全性远高于PBKDF2)生成256位的Master Key,再用这个Master Key+随机IV(每个密码条目单独生成)通过AES-GCM(带认证的加密算法,防篡改)加密每个密码条目,最终把加密后的条目、IV、认证标签、Master Salt一起上传到服务器存储。
- 当用户在移动端登录时:
- 输入主密码
- 客户端从服务器获取Master Salt和加密后的密码库
- 用同样的主密码+Master Salt+KDF生成完全相同的Master Key
- 用Master Key+存储的IV解密每个密码条目
简单说:服务器只存“加密后的箱子”和“开箱子需要的锁孔模型(盐)”,真正的“钥匙(Master Key)”是用户用主密码在本地亲手生成的,服务器从头到尾都碰不到钥匙。
基于ASP.NET Core+React+IdentityServer的实现方向
结合你的技术栈,核心原则是所有敏感操作(密钥生成、加解密)必须在React客户端完成,服务器只做存储和身份验证的辅助工作,具体拆解如下:
1. 客户端(React)核心逻辑实现
- 注册流程:
- 生成随机的Master Salt(16字节以上)和Login Salt(16字节以上)
- 用主密码+Login Salt通过KDF生成Login Key,将Login Key的哈希(比如SHA-256)上传到服务器,用于后续登录验证
- 用主密码+Master Salt通过KDF生成Master Key(优先用浏览器原生Web Crypto API实现,避免手写加密逻辑出错)
- 对用户的初始密码库(空或默认条目)进行加密,将加密后的密文、IV、认证标签、Master Salt上传到服务器存储
- 登录流程:
- 用户输入主密码后,从服务器获取Login Salt和Master Salt
- 用主密码+Login Salt生成Login Key,发送到服务器验证哈希是否匹配(服务器只存Login Key的哈希,永远碰不到主密码)
- 验证通过后,从服务器获取加密后的密码库,用主密码+Master Salt生成Master Key,本地解密得到明文密码库
- 密码条目增删改:
- 每次新增/修改条目时,生成新的随机IV,用Master Key+AES-GCM加密条目内容,将密文、IV、认证标签上传到服务器更新
- 删除时直接通知服务器删除对应加密条目即可
2. 服务器端(ASP.NET Core+IdentityServer)的角色
- 身份验证改造:
- 不要用IdentityServer默认的密码存储逻辑,因为默认会存储用户密码的哈希,而你需要的是存储Login Key的哈希
- 自定义IdentityServer的资源所有者密码验证逻辑,接收客户端发送的Login Key,验证其哈希是否与服务器存储的一致
- 数据存储:
- 仅存储用户的基本身份标识(比如邮箱)、Login Key哈希、Master Salt、加密后的密码库条目(包含密文、IV、认证标签)
- 绝对不要存储Master Key、主密码的明文或任何可以推导Master Key的敏感信息
- API接口:
- 提供简单的CRUD接口用于同步加密后的密码库数据,接口不需要处理任何解密逻辑,只负责数据的存储和传输
3. 关键安全细节
- 加密算法选型:
- 密钥派生用Argon2id(Web Crypto API如果不支持,可引入第三方库如
argon2-browser),不要用PBKDF2(迭代次数需要非常高才能达到相同安全级别) - 加密用AES-GCM或ChaCha20-Poly1305,这两种都是带认证的加密算法,能防止密文被篡改或伪造
- 密钥派生用Argon2id(Web Crypto API如果不支持,可引入第三方库如
- 客户端安全防护:
- 所有密钥(Master Key、Login Key)只存在内存中,不要存储到localStorage/sessionStorage,避免XSS漏洞窃取密钥
- 输入主密码时避免使用第三方输入组件,防止恶意脚本监听输入
- 用户退出登录时立即销毁内存中的密钥
- 服务器端安全防护:
- 所有API接口启用HTTPS,防止数据传输过程中被窃听
- 对存储的加密数据进行备份,但备份同样不能包含任何敏感密钥信息
内容的提问来源于stack exchange,提问作者TW_KuanLun
相关产品推荐
相关产品推荐

