临时存储密码的最安全方式

Most secure way to temporarily store a password

我有以下用例:

我的 Web 应用程序用于创建处方。当我向政府 API 发送处方创建请求时,它是用当前用户的证书签名的。证书存储在应用服务器上,并使用只有用户知道的密码进行加密。 用户希望能够将他们的密码暂时存储在我的应用程序中,这样他们就不需要为他们创建的每个处方粘贴密码。

存储此密码最安全的方法是什么?一些想法:

  1. 浏览器中的本地存储。

    不好,因为有权访问用户设备的任何人都可以看到 密码,即使他们没有登录。此外,如果应用程序不是 运行 如果所需的存储时间到期,我将无法清除密码。

  2. 前端应用内存。

    不好,因为如果用户刷新页面或打开另一个选项卡,存储的密码就会消失。

  3. 后端,在数据库中

    这听起来是最好的选择,因为我可以加密密码。它甚至值得加密吗?我将不得不使用存储在同一台机器上的一些密钥对其进行加密,因此如果有人可以访问这台机器,加密并不重要,因为他们能够很容易地对其进行解密。

将密码加密密钥和加密后的密码分开:

  1. 生成并存储随机密钥(和 nonce/salt)
  2. 使用随机密钥加密密码(例如AES-256-GCM
  3. 将加密的密码存储在您的后端
  4. 随请求发送随机密钥以临时解密密码
  5. 会话过期后删除后台加密密码

这样:

  • 保存在浏览器中的随机密钥只能在当前用户会话中使用,本身无用
  • 您后台的加密密码只能与浏览器中存储的随机密钥配合使用,本身无用