假设我正在创建一个webapp,用户可以在其中创建一个嵌套的字符串树(包含敏感信息)。这些字符串可能很短。我希望在保存之前加密此树中的键和值。树中的所有值都将使用用户提供的对称密钥在客户端加密。同样,在阅读时,它们将在客户端解密。
树保存在Mongo数据库中。
我无法决定是否应该序列化树并加密它有一个完整的字符串或是否单独加密值,考虑到树中的所有数据都将使用相同的密钥加密。
两者的优点和缺点是什么?
据我所知,AES使用128位的块大小,这意味着编码时任何字符串的长度最多可达15个字符,这有利于编码序列化字符串(如果您想避免开销)
注意:虽然webapp将同时使用HTTPS,IP白名单和多因素身份验证,但我希望在Mongo数据库被盗的情况下努力防止数据泄露。这就是我要去的地方。关于如何实现这一目标的建议或想法表示赞赏。
此外,我还希望我的服务能够激发信任。以明文形式发送数据(尽管通过HTTPS)意味着用户必须信任我才能加密它,然后再保留它。加密客户端允许我强调我不知道(或需要知道)我正在保存的内容。
答案 0 :(得分:2)
我无法想到为什么这些方法在实际字符串的安全性方面会有所不同(假设它们都正确实现)。单独加密字符串显然意味着树的结构不会是秘密的,但我不确定你是否关注它。例如,如果你单独加密每个字符串,看到密文的人可以找出树中有多少个密钥,他也可以了解每个密钥和值的长度。如果您将树加密为整个序列化blob,那么看到密文的人可以大致判断树中有多少数据,但没有关于单个键/值的长度或数量的信息。
就开销而言,填充将是一个考虑因素,如您所述。更大的存储开销来源是IV:如果您使用的是分组密码模式,例如CTR,则需要为每个密文使用不同的IV。这意味着如果要单独加密每个字符串,则需要为每个字符串存储IV。如果你加密整个序列化树,那么你只需要为那个密文存储一个IV。
在使用Javascript实现此功能之前,您应该确保通过客户端加密实际上获得了安全性方面的真正改进。本文是经典之作:http://www.matasano.com/articles/javascript-cryptography/重要的一点是要记住服务器提供的是Javascript加密代码,因此加密客户端上的数据并不能保护服务器免受服务器的影响。如果您主要关注的是数据被盗,那么只需加密服务器上的数据,然后再将其插入数据库,即可实现相同的安全性。
答案 1 :(得分:0)
首先,我不是安全专家; - )
我无法决定是否应该序列化树并加密它有一个完整的字符串或是否单独加密值,考虑到树中的所有数据都将使用相同的密钥加密。
我会说首先序列化树并加密其结果具有最大的 con 。
在成功破解加密方面发挥重要作用的是通常在原始文本中经常出现的某些字符的知识 - 例如英语中的字母e和n - 并根据加密文本进行统计分析
现在假设您在加密之前使用例如JSON来序列化您的树客户端。作为攻击者,我很容易知道,因为我可以在闲暇时分析您的客户端脚本。所以我也已经知道“字母”{,},[,],:和“将在你加密的每个”文本“中出现的比例很高......并且每个文本的第一个字母都是{或者[(基于你的树是一个对象还是一个数组) - 对于你的应用程序加密的文本,这已经是非常有用的知识了。