1

假设我正在创建一个 web 应用程序,用户可以在其中创建一个嵌套的字符串树(包含敏感信息)。这些字符串可能很短。我想在保存之前加密这棵树中的键和值。树中的所有值都将使用用户提供的对称密钥在客户端进行加密。同样,它们将在读取时在客户端被解密。

树保存在 Mongo 数据库中。

考虑到树中的所有数据都将使用相同的密钥加密,我无法决定是否应该序列化树并加密它具有整个字符串或是否单独加密值。

两者的优缺点是什么?

据我所知,AES 使用 128 位的块大小,这意味着任何字符串在编码时都可以增长到 15 个字符的长度,这有利于对序列化字符串进行编码(如果你想避免开销)

注意:虽然 webapp 将同时使用 HTTPS、IP 白名单和多因素身份验证,但我想努力防止 Mongo 数据库被盗时数据泄露。这就是我要去的地方。对如何实现这一点的建议或想法表示赞赏。

更新

此外,我还希望我的服务能够激发信任。以明文形式发送数据(尽管通过 HTTPS)意味着用户必须信任我在持久化之前对其进行加密。加密客户端使我能够强调我不知道(或需要知道)我正在保存什么。

4

2 回答 2

2

我想不出为什么这些方法在实际字符串的安全性方面会有所不同(假设它们都正确实现)。单独加密字符串显然意味着树的结构不会是秘密的,但我不确定你是否关心这一点。例如,如果您单独加密每个字符串,那么看到密文的人可以找出树中有多少个密钥,他还可以了解每个密钥和值的长度。如果您将树作为一个完整的序列化 blob 进行加密,那么看到密文的人可以大致知道树中有多少数据,但对单​​个键/值的长度或数量一无所知。

正如您所提到的,就开销而言,填充将是一个考虑因素。更大的存储开销来源是 IV:如果您使用 CTR 等分组密码模式,则需要为每个密文使用不同的 IV。这意味着如果您单独加密每个字符串,则需要为每个字符串存储一个 IV。如果你加密整个序列化树,那么你只需要为那个密文存储一个 IV。

但是,在您用 Javascript 实现此功能之前,您应该确保您实际上通过客户端加密获得了真正的安全性改进。这篇文章很经典: http: //www.matasano.com/articles/javascript-cryptography/重要的一点是要记住服务器提供的是 Javascript 加密代码,因此在客户端加密数据并不能保护它免受服务器。如果您主要关心的是数据库被盗,您可以通过在将数据插入数据库之前加密服务器上的数据来实现相同的安全性。

于 2013-03-16T22:07:33.183 回答
0

首先,我不是安全专家;-)

考虑到树中的所有数据都将使用相同的密钥加密,我无法决定是否应该序列化树并加密它具有整个字符串或是否单独加密值。

我会说首先序列化树并加密其结果具有最大的缺点

在成功破解加密中起重要作用的往往是对在原始文本中经常出现的某些字符的了解——例如英语中的字母 e 和 n——以及基于这些字符对加密文本进行统计分析。

现在假设您在加密之前使用 JSON 序列化您的树客户端。作为攻击者,我很容易知道这一点,因为我可以在闲暇时分析您的客户端脚本。所以我也已经知道,“字母”{、}、[、]、: 和“将在您加密的每个“文本”中出现的比例很高……而且每个文本的第一个字母要么是{ 或 [ (基于你的树是对象还是数组)——这已经是关于被你的应用程序加密的文本的相当多的潜在非常有用的知识。

于 2013-03-16T21:54:04.183 回答