我有以下用例:
我的 Web 应用程序用于创建处方。当我将处方创建请求发送到政府 API 时,它会使用当前用户的证书进行签名。证书存储在应用程序服务器上,并使用只有用户知道的密码进行加密。 用户希望能够将其密码临时存储在"我的应用"中,这样他们就不需要为他们创建的每个处方粘贴密码。
存储此密码的最安全方法是什么?几个想法:
-
浏览器中的本地存储。
不好,因为有权访问用户设备的任何人都可以看到 密码,即使他们未登录。此外,如果应用程序未运行,如果所需的存储时间到期,我将无法清除密码。
-
前端应用内存。
不好,因为如果用户刷新页面或打开另一个选项卡,则存储的密码将消失。
-
后端,在数据库中
这听起来像是最好的选择,因为我可以加密密码。甚至值得加密吗?我必须使用存储在同一台计算机上的一些密钥对其进行加密,因此如果有人可以访问这台机器,加密并不重要,因为他们可以轻松解密它。
分隔密码加密密钥和加密密码:
- 生成并存储随机密钥(和随机数/盐(
- 加密密码(例如
AES-256-GCM
( 与随机键 - 将加密的密码存储在后端
- 发送随机密钥并请求临时解密密码
- 会话过期时删除后端的加密密码
那边:
- 存储在浏览器中的随机密钥只能在当前用户会话中使用,并且本身毫无用处
- 您备份的加密密码只能与存储在浏览器中的随机密钥一起使用,并且本身毫无用处