我知道已经有一些关于此的问题,但我只是想知道是否有人可以查看我的设计计划,看看是否存在任何巨大的安全漏洞。我正在制作一个 Web 应用程序,它可以安全地存储敏感信息,然后可以由有权访问它的工作人员检索。
我有两台服务器——一个主服务器和一个解密服务器。主服务器存储加密数据、验证用户、输出 HTML 等。解密服务器只存储部分私钥,当部分密钥与存储在主服务器上的另一半组合时进行解密。当然,一切都是通过 SSL 完成的,即使在两台服务器之间也是如此。两台服务器之间将存在其他限制,例如仅限于这两个 IP 地址以及将解密次数限制为一定数量(例如,每 15 秒一次,其他所有内容都会排队 - 如果队列到达,则自毁一定数量并需要管理员干预)。
我正在寻找的功能是让匿名用户能够通过网站将新数据加密到数据库中,所有员工都能够更新现有条目,特权员工能够解密存储的数据。
使用的键和散列摘要
编辑 - 为清楚起见,只有两种类型的键。两者都是不对称的。为了简单起见,我更改了这篇文章并简单地将它们称为 key1 和 key2。Key2 将被异或成两部分,key2a 和 key2b,它们再次组合以创建 key2。Key1是对key2进行加密的密钥加密密钥。Key2 用于解密敏感信息。
主服务器:
- 用于身份验证的用户密码哈希,存储在数据库中。
- Key1 - 密钥加密密钥临时存储在 RAM 中,并永久存储在管理员的个人计算机和/或闪存驱动器上,位于完全不同的位置和网络
- key2a 密钥 - 存储在由上述密钥加密密钥 (key1) 加密的数据库中的部分私钥。
- 上面两个私钥的两个公钥都以纯文本形式存储在数据库中。
解密服务器
- Key2b 密钥 - 上述部分私钥的另一半
密钥生成:
- 密钥加密密钥 (key1) 基本上可以在任何地方生成,可能在管理员自己的 PC 上。
- 另一个密钥对 (key2) 由主服务器生成,每个要加密的信息都有一个。
加密过程如下:
- 生成一个新的 key2 私钥和公钥对(每个敏感数据不同的密钥对)
- 信息使用key2的公钥加密并存储在数据库中
- 然后将 Key2 的私钥异或成两部分(key2a 和 key2b)。
- key2a 使用 key1 的公钥加密并存储在数据库中
- key2b 被发送到解密服务器
- 解密服务器将 key2b 存储在其数据库中并发送回插入 ID
- 插入存储在主数据库中的 ID
解密过程:
- key1(密钥加密密钥)存储在 memcache(或 redis)中。管理员必须手动上传此密钥。它将在他们自己的计算机上生成。它临时存储在 RAM 中(直到服务器停机)并离线永久存储在管理员的计算机或闪存驱动器上。
- 使用自己的用户名和密码进行身份验证的非管理员员工
- 如果他们有权限,他们可以从内存缓存服务器检索 key1
- key1 解密存储的半私钥 key2a
- key2a 和加密数据连同各自的插入 ID 一起发送到解密服务器
- 解密服务器然后结合 key2a 和 key2b 来创建 key2
- Key2 然后解密信息并将其发送回用户
- 对于密钥轮换,解密的信息然后使用加密过程中概述的新 key2 对重新加密
完整的密钥轮换(从解密服务器启动)
我不确定这是否有必要,但这是我的想法。让我感到不舒服的一件事是,解密服务器的所有数据都将暂时未加密(至少在内存中)。同样,我必须让这台服务器免费访问来自主服务器的加密数据和密钥,这也可能会打开另一罐蠕虫病毒,如果这台服务器遭到入侵,基本上游戏就会结束。我也在下面的一个问题中解决了这个问题:
- 解密服务器登录到主服务器并请求完整转储所有加密数据
- 在解密服务器上生成一个新的key1密钥加密密钥对
- 所有加密数据均使用旧密钥解密1
- 为上一步中的每条解密数据生成一个新的 key2 对,并使用此密钥重新加密数据。这些被异或到新的 key2a 和 key2b 中。
- 使用新密钥 1 重新加密的新密钥 2a
- 新加密的数据数组、新的 key2a 和各自的 id 被发送回主服务器并直接存储到数据库中
- 在主服务器上,新的 key1 被保存到内存缓存中
- key1 也需要以某种方式发送给管理员,以便他们可以在 memcache 服务器出现故障时重新启动它。由于管理员应该拥有旧密钥 1,也许用旧密钥 1 加密新密钥 1,然后简单地通过电子邮件将其发送给管理员就足够了。
我不确定的几件事:
- 使用 memcache 存储私钥加密密钥是否足够安全?如果没有,我对其他想法持开放态度。
- 对于密钥轮换,定期轮换所有密钥(包括 key1 和所有密钥 2)是一种很好的做法,正如我在上面的“完整密钥轮换”部分中概述的那样,或者只是在使用时轮换 key2,因为每个密钥都是不同的 key2一块加密数据?
编辑 :: 要回答 DW 下面的问题,我不确定如何创建威胁模型,但我假设您基本上想知道我要保护什么。老实说,我不确定。从本质上讲,我希望只有授权的工作人员能够获得解密的数据,所以无论这需要什么,这都是我想要保护的。如果其中任何一个服务器受到威胁,我希望影响完全减轻或至少最小化。例如,如果有人要破解解密服务器,他们仍然需要加密数据和部分解密密钥。如果有人要入侵主服务器,他们将需要密钥加密密钥,如果服务器出现故障,该密钥将从内存中删除;如果服务器还在,