我正在开发一个应用程序,我想为文件提供端到端加密,多个用户可以访问这些文件夹。我希望加密尽可能透明和无摩擦(我不希望用户必须管理自己的密钥),所以我一直在考虑如何做到这一点。
该协议的要求是:
- 用户不必管理自己的密钥
- 用户必须能够从多个设备上使用它
- 在更换设备时,用户必须仍然可以访问他们的旧文件
我目前的想法是:
- 当用户注册时,生成一个密钥对(客户端)
- 使用从 salt + 密码(客户端)派生的对称密钥加密他们的私钥
- 将公钥、加密私钥
hash(salt + password)和盐上传到 API - 服务器端,存储公钥和加密私钥。由于用户密码用于加密他们的私钥,因此永远无法以明文形式将其传输到服务器。相反,如果传输散列,则不会泄露他们的密码,但是如果攻击者要破坏数据库,则可以使用散列登录到他们的帐户,但不能解密文件。为了解决这个问题,传输的密码散列在服务器端重新散列并存储。
- 当用户创建文件夹时,生成新的对称密钥,并使用该密钥加密这些文件(客户端)
- 使用用户公钥(客户端)加密此对称密钥
- 当用户登录时,下载他们的公钥和加密私钥
- 解密私钥,存储在设备上
- 使用私钥解密对称密钥,然后解密文件
- 为了将 A 拥有的文件夹访问权限授予另一个用户 B,用户 A 从 API 获取用户 B 的公钥,使用自己的私钥解密文件夹对称密钥,然后使用 B 的公钥再次加密对称密钥,然后再传输它回到 API。然后,用户 B 可以获取加密的对称密钥,使用他们的私钥对其进行解密,并解密文件夹内容
这种方法有意义吗(从安全性和可用性的角度来看)?是否有任何警告或潜在的陷阱?
我知道多方非对称加密有 N 次协议,但是由于它是文件而不是存储的消息,因此从带宽的角度来看是不现实的。