我有一个体系结构,它需要一个特定的数据子集才能得到更严格的保护和加密。我认为符合工程范围的主要参数如下:
我粗略地设想了一个我认为非常适合这个系统的东西,我想看看它是如何经得起一些受过教育的批评。初步设计如下:
POST /resource-group。中创建共享加密资源
POST resource { groupId, dataEncryptedWithResourceGroupKey }加密的数据。检索共享加密资源
GET resource [...resourceIds]发布于 2022-04-08 16:32:56
第一件事:这不是E2E。服务器持有资源组的私钥,因此可以解密/日志/更改任何内容。开发人员或数据库管理员可以危及所有数据。
要成为真正的E2E,应该要求用户接收带外的公钥。从您的应用程序接收它们意味着服务器可以为每个用户发出一个键盘,并解密、记录、重新加密和转发所有消息。每个用户都必须能够共享他们的公钥(比如Android上的共享功能),这样他们就不会依赖服务器了。
在此之后,用户应该创建资源,使用对称密钥在本地加密,用所有预期收件人的公钥加密密钥,并将资源加上加密的对称密钥发送到服务器。接收方将下载这两个文件,用其私钥解密对称密钥并读取数据。服务器不能清除任何私钥或对称密钥,因为这会破坏E2E。
用户也必须存储朋友的公钥,服务器不应该提供这些密钥。如果用户提供它们,则服务器处于模拟位置。公钥必须从波段接收并导入到您的应用程序中。
MITM取决于您的应用程序是否正确地检查TLS证书,以及如果服务器不向客户端提供任何密钥。如果服务器和客户端都检查TLS证书,攻击者就不可能截获和更改数据。但是,如果客户端允许使用无效的证书,并且仍然建立连接,则它将易受攻击。如果服务器从未提供任何公钥,则不可能模拟任何客户端。
暂时访问并不容易实现。如果您使用我编写的更改,昨天资源组中允许的任何用户仍然可以访问昨天发送的数据,但不能访问下一个数据。用户投递到资源组将不会在新消息上使用已删除用户的密钥,并且用户将无法解密任何内容。在成员身份之前发送的消息也是如此:他的密钥不是用来加密对称密钥的,除非另一个用户转发消息,否则他无法读取这些密钥。
对于AES密钥(而不是RSA),在可预见的将来,192位就足够了。在接下来的十年左右,128位比特已经足够了,但是现在拥有192位并没有什么坏处。对于RSA,2048位被认为是一个高安全性的密钥.
无法确定“最佳版本”。安全性和可用性始终是一种权衡。增加可用性会降低安全性,反之亦然。
https://security.stackexchange.com/questions/261031
复制相似问题