如何存储加密密钥?

How to store encryption key?

我查看了许多密码管理器,例如 keeper、1password、secret-in,我正在关注 secret-in 密码管理器来创建我自己的项目并尝试添加相同的功能,但在存储用户数据时遇到了困难,例如his/her 秘密,加密形式的支付秘密。我看了 keeper here 的加密模型,但还是没看懂。 在哪里存储服务器端加密密钥? 我的数据库中有一些使用单个密钥对称加密的数据。我正在寻找一种更安全的方法来存储加密密钥,而不是将其硬编码到我的代码中。我可以在哪里安全地存放它?

这里的方法很简单。

您只向 storage/backup 的服务器发送加密数据。 收到的加密数据没有密钥。

您需要确保所有加密和解密都在用户设备本地进行。因此用户需要提供密钥。

用户不擅长提供高质量的密钥 material,因此,相反,要求用户提供密码,获取该密码并通过基于散列的密钥派生函数传递它,其参数使得功能慢(高操作,高内存要求)。像 pbkdf2 这样的算法和像 HMAC-SHA-2 这样的强 PRF 应该就足够了。

更新: 要回答您的具体问题,您需要执行以下步骤,您将需要使用支持从密码和对称加密中导出密钥的加密库,例如 libsodium。

  1. 首次使用时要求用户提供密码
  2. 运行这个密码通过密钥推导从中推导出一个密钥:https://libsodium.gitbook.io/doc/key_derivation
  3. 使用密钥执行用户数据加密:https://libsodium.gitbook.io/doc/secret-key_cryptography
  4. 销毁密钥并将数据发送到服务器进行备份