多用户端到端加密

信息安全 加密
2021-09-06 04:17:51

我正在开发一个应用程序,我想为文件提供端到端加密,多个用户可以访问这些文件夹。我希望加密尽可能透明和无摩擦(我不希望用户必须管理自己的密钥),所以我一直在考虑如何做到这一点。

该协议的要求是:

  1. 用户不必管理自己的密钥
  2. 用户必须能够从多个设备上使用它
  3. 在更换设备时,用户必须仍然可以访问他们的旧文件

我目前的想法是:

  1. 当用户注册时,生成一个密钥对(客户端)
  2. 使用从 salt + 密码(客户端)派生的对称密钥加密他们的私钥
  3. 将公钥、加密私钥hash(salt + password)和盐上传到 API
  4. 服务器端,存储公钥和加密私钥。由于用户密码用于加密他们的私钥,因此永远无法以明文形式将其传输到服务器。相反,如果传输散列,则不会泄露他们的密码,但是如果攻击者要破坏数据库,则可以使用散列登录到他们的帐户,但不能解密文件。为了解决这个问题,传输的密码散列在服务器端重新散列并存储。
  5. 当用户创建文件夹时,生成新的对称密钥,并使用该密钥加密这些文件(客户端)
  6. 使用用户公钥(客户端)加密此对称密钥
  7. 当用户登录时,下载他们的公钥和加密私钥
  8. 解密私钥,存储在设备上
  9. 使用私钥解密对称密钥,然后解密文件
  10. 为了将 A 拥有的文件夹访问权限授予另一个用户 B,用户 A 从 API 获取用户 B 的公钥,使用自己的私钥解密文件夹对称密钥,然后使用 B 的公钥再次加密对称密钥,然后再传输它回到 API。然后,用户 B 可以获取加密的对称密钥,使用他们的私钥对其进行解密,并解密文件夹内容

这种方法有意义吗(从安全性和可用性的角度来看)?是否有任何警告或潜在的陷阱?

我知道多方非对称加密有 N 次协议,但是由于它是文件而不是存储的消息,因此从带宽的角度来看是不现实的。

2个回答

就使用一个对称密钥来加密文件并在授权用户之间共享该密钥并使用公钥对其保密而言,您的方法是有意义的。

为了解决在您的服务器上存储私钥的问题(即使它们已被加密),您可以在用户每次从新设备登录时向他们发出一个新的密钥对。这将允许您的用户在设备丢失、应用程序被删除等情况下与任何给定的密钥对解除关联。这也可以让您在被盗的情况下灵活地删除单个设备,尽管这需要重新加密与该用户关联的所有文件使用新的对称密钥。

您是否查看过用于 C、Java 和 Javascript的Signal Protocol ( wikipedia ) 和libsignal 库?

我相信它满足您的所有三个要求,而且它具有由加密专家团队精心打造的优势,除非您是专家团队,否则您将做错加密。