Javascript 使用相同的对称密钥加密小字符串的嵌套映射

Javascript 使用相同的对称密钥加密小字符串的嵌套映射,javascript,ruby-on-rails,cryptography,mongoid,cryptojs,Javascript,Ruby On Rails,Cryptography,Mongoid,Cryptojs,假设我正在创建一个webapp,用户可以在其中创建一个嵌套的字符串树(带有敏感信息)。这些弦大概很短。我想在保存此树之前对其中的密钥和值进行加密。树中的所有值都将使用用户提供的对称密钥在客户端进行加密。同样,在读取时,它们将在客户端解密 该树被保存在Mongo数据库中 考虑到树中的所有数据都将使用相同的密钥加密,我无法决定是序列化树并加密它的整个字符串,还是单独加密值 两者的利弊是什么 据我所知,AES使用128位的块大小,这意味着编码时任何字符串的长度都可以增加到15个字符,这有利于编码序列化

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

该树被保存在Mongo数据库中

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

两者的利弊是什么

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

注意:虽然webapp将同时使用HTTPS、IP白名单和多因素身份验证,但我希望在Mongo数据库被盗的情况下努力防止数据泄露。这就是我的目的。对于如何实现这一目标的建议或想法,我们将不胜感激

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

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

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

我想说的是,首先序列化树,然后对结果进行加密,这会产生最大的con

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


现在让我们假设您使用JSON对树客户端进行序列化,然后再对其进行加密。作为攻击者,我很容易知道这一点,因为我可以在空闲时分析您的客户端脚本。因此,我也已经知道,“字母”{、}、[、]、:和“将在您加密的每个“文本”中有很高的出现率……并且每个文本的第一个字母将是{或[(基于您的树是对象还是数组)–关于应用程序加密的文本,这已经是相当多的潜在非常有用的知识了。

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

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


但是,在用Javascript实现这一点之前,您应该确保通过客户端加密确实提高了安全性。本文是一篇经典文章:重要的一点是要记住,服务器提供了Javascript加密代码,因此在客户端加密数据并不能保护它免受攻击服务器。如果您主要关心的是被盗数据库,则可以通过在将数据插入数据库之前对服务器上的数据进行加密来实现相同的安全性。

频率分析不是现代密码系统的问题。如果是的话,我们会遇到很多麻烦。:)例如,监视HTTPS流量的攻击者几乎知道这一点所有请求都以“GET”或“POST”开头,但这并不能帮助他解密其余的请求。当然,有一些不安全的方法可以加密数据,这样频率分析就有助于攻击者(例如,ECB模式下的AES),但如果OP使用的是一个像样的高级加密库,那么在这些攻击不适用的情况下使用安全密码模式就很容易了。谢谢你的回答。我读了这篇文章,这是一个有趣的观点。除非用户自带加密库,否则这将无法防范MITM攻击。但是,如果没有加密,cli在ent方面,我的服务的任何评论者都很容易声称用户对我的信任是不可分权的,他们以透明的方式提交数据(尽管是通过HTTPS),并委托我在保存数据之前对其进行加密。如果wireshark表示我不知道我在存储什么,我想我会更容易赢得人心。