正如@AviD 指出的那样,“安全”是一个广泛的术语,因此可以调用几个属性。在这里,我将专注于保密。
因此,您希望某些人共享一些文档,这些文档对于该组之外的人必须保持不可读,这样您就可以在该组中添加或删除一些人。需要注意的一点是,从概念上讲,你不能强迫人们变得失忆。因此,如果小组中的某个成员可以在某个时候阅读一份文件,那么他完全可以在某处保存一份副本。因此,撤销用户的访问权限就是不让该用户读取新文档;对于旧文件,这“为时已晚”。鉴于这一点,一个可能的解决方案如下所示:
每个文档都使用随机密钥K(每个文档的新密钥)对称加密。
每个用户都有自己的公钥和私钥对,适用于非对称加密(例如 RSA 或 El-Gamal 密钥对)。
每个文档都有一个标题,其中包含使用每个被认为有权阅读该文档的用户的公钥对K进行的加密。
要撤销用户,只需停止使用该用户的公钥加密新文档的K。
要追溯添加用户,请使用该用户的公钥计算K的加密,对于必须授予访问权限的每个旧文档;当然,这只能由可以访问所述文档的另一个用户来完成(即获取K)。
上面的系统正是OpenPGP所描述的(有关开源实现,请参阅GnuPG )。这是为了安全的电子邮件发送,但不管实际的传输介质如何,它都可以工作,这可能是一个共享的存储区域。
上述方案存在缺陷:
生成文档的人必须知道应该能够访问文档的人员列表。这不是绝对要求;我们可以想象一个文档从一个用户传播到另一个用户的设置,每个用户为下一个用户添加加密的K。
每个文档都有一个标题,它随着系统中的用户数量线性增长;对于相当安全的 RSA 加密(2048 位 RSA 密钥),每个用户需要 256 个额外字节。根据具体情况,开销的范围从完全可以忽略不计到可笑的难以忍受。
任何人都可以通过查看加密文档的标题来推断可以访问该文档的用户列表。
用户拥有公钥,这意味着以安全方式分发公钥的常见问题——即同时避免篡夺者。如果有很多用户,则解决方案涉及公钥基础设施 ( PKI );OpenPGP 使用一种被称为“信任网络”的去中心化 PKI。X.509是另一个 PKI 标准,具有金字塔形的集中式结构。两者都擅长管理简单的案例,不擅长扩大规模。
另一个非常不同的安全文档共享方案是使用蓝光光盘完成的,具有AACS复制保护。安全模型是有一种中央权威,但离线;每个用户(蓝光播放器)都有自己的对称密钥,中央机构也知道。当权威机构发布一个新文档(例如,一部新电影)时,该文档使用自己的对称密钥K进行对称加密,并且该密钥K通过广播加密提供给所有玩家。权威想要将K分配给N 个用户,其中N很大,同时使用相对较少的带宽(N可以达到数亿的数量级,但光盘上没有那么多可用空间),能够追溯添加新用户而无需任何特定于文档的传输(一旦构建和分发光盘,您就无法修补光盘) ,并且仍然有可能撤销特定用户。AACS 中使用的广播加密的数学优点在于它只需要每个磁盘上的大小O(log N),再加上O(R),其中R是撤销用户的数量。可以随意添加新用户。这个想法是,只有当玩家密钥似乎已被披露并开始在流氓玩家中被广泛复制时,才会撤销“用户”;希望(也就是说,蓝光联盟希望如此),单个播放器破解成本将保持足够高,以至于必须撤销不超过几十个这样的密钥。
广播加密使用双嵌套树的结构,在这里描述有点太长了。有关详细信息,请参阅本文。
这里显然是对广播的话题现有的一些研究非对称加密,从而避免了为它知道的所有键中央权威的需要。我不知道目前是否已知有这种效果的良好、安全的方案。