【发布时间】:2014-04-12 18:05:35
【问题描述】:
假设我有一个存储加密文本的服务器(端到端:服务器永远不会看到纯文本)。
我希望能够对该文本进行全文搜索。
我知道这很棘手,但我的想法是使用传统的全文设计(“列表”和“匹配”表存储单词并与内容表中的 id 匹配)。当用户提交加密文本时,他们还会发送单词和相应匹配项的加盐 MD5。每个用户使用的盐都是唯一的,并且可以从他们的密码中恢复。
(简而言之:唯一的区别是“列表”表将包含散列词)
现在,这个系统会有多脆弱?
请注意,我说的是“多么脆弱”而不是“多么安全”,因为我承认它不可能完全安全。
我确实了解功能(全文搜索)和安全性(从单词索引中披露一些信息)之间的权衡。例如,我了解能够获取列表和匹配表的攻击者可以获取有关原始加密文本的信息,并且可能能够通过统计分析破译某些单词(但是,由于 salt 是唯一的对于每个用户,这将需要为每个用户重复)。
这种威胁会有多严重?还会有其他严重威胁吗?
免责声明
我正在尝试构建的(并在密码学家的帮助下进行实际实施;现在我只是想了解这是否可能)是一种消费级产品,它将处理机密但不完全机密的数据.
我的目标只是提供一些足够安全的东西,这样攻击者就可以更容易地尝试窃取用户的密码(例如,侵入客户——他们最终是消费者),而不是花费大量资金尝试暴力破解索引或运行复杂的统计分析的时间和计算能力。
回复@Matthew的评论
(可能与其他回答的人有关)
如您所述,其他解决方案不可行。将所有数据存储在客户端中意味着用户无法从其他客户端访问他们的数据。服务器端加密可以工作,但我们将无法为用户提供客户端加密的额外安全性。
唯一“真正的选择”就是不实现搜索:虽然这不是必需的功能,这对我/我们来说非常重要。盐的保护方式与用户的解密密钥(用于解密存储文本的密钥)完全相同。因此,如果有人能够捕获盐,他或她可能也能够捕获密钥,从而产生更大的问题。
准确地说,密钥和盐将加密存储在服务器上。它们将由客户端使用用户密码在本地解密并保存在内存中;服务器永远不会看到解密的密钥和盐。然后,用户可以更改密码,他们只需要重新加密密钥和盐,而不是所有存储的文本。据我所知,这是业内相当标准的方法。-
实际上,数据库的设计如下(仅报告相关条目)。这种设计就像您在评论中提出的那样。它不允许邻近搜索(与我们不太相关)并降低频率准确度。
- 表
content,包含所有加密文本。列是content.id和content.text。 - 表
words,包含所有哈希列表。列是words.id和words.hash。 - 表
match,匹配带有哈希/单词的文本(一对多关系)。列是match.content_id和match.word_id。
- 表
我们必须实现删除停用词等功能。当然。这不是一个大问题(当然,将在客户端完成)。最终,这些列表对国际(即非英语)用户的效用一直有限。
我们预计查找/插入比率会非常高(即查找很多,但插入很少,而且大部分是批量)。解密整个哈希数据库当然是可能的,但需要强力攻击。
假设盐是安全的(根据上面的第 2 点)。如果盐足够长(你引用了 32 位......但为什么不 320? - 只是一个例子)那将需要很多时间。
总结...您证实了我对频率分析可能存在风险的怀疑。但是,我觉得这种风险并没有那么高。你能确认一下吗?
事实上,首先,每个用户的盐都是唯一的。这意味着必须同时攻击一个用户。
其次,每个文本只报告一次单词(无论它们出现多少次),频率分析变得不那么可靠。
第三……例如,对散列词的频率分析听起来不如对凯撒移位的频率分析好。仅英语就有 250,000 个单词(同样,并非所有用户都会说英语),即使某些单词比其他单词更常见,我相信无论如何也很难进行这种攻击。
PS:我们将存储的数据是消息,例如即时消息。这些很短,包含很多缩写词、俚语等。每个人都有不同的写作风格,进一步降低了频率攻击的风险(在我看来)。
【问题讨论】:
-
你会为文本中的每个单词做一个哈希吗?盐会保密吗?为每个英文单词(少于 250000 个单词)计算一个 MD5 散列并不需要很长时间。这是我显卡上 0.1 秒的计算时间。
-
@EbbeM.Pedersen 这是一个公平的批评。 salt 将从用户的密码生成(与文本的加密密钥相同),并且对于每个用户都是唯一的。窃取盐的攻击者需要窃取密码(因此一切都失败了)或破解他/她的客户端。但是,如果您认为这还不够,我非常愿意接受建议/cmets(因为这是我提出问题的目的)。
-
@EbbeM.Pedersen 是的,它大致是文本中每个单词的一个(加盐)哈希值。例如,对于单词“dog”(加盐“blah”),客户端会将 MD5("dogblah") 作为散列词发送以存储在数据库中。 MD5 或 SHA1 或 SHA256 或类似的。
-
@72DFBF5BA0DF5BE9 我明白哈希是如何工作的。我不需要还原它们。您熟悉如何实现全文搜索引擎吗?通常,您需要两个表:“列表”和“匹配”。在“列表”中,我存储了散列而不是简单的单词。
-
而不是漏洞,我会质疑这个系统的可用性或根本有用,在数据库中存储散列的单词有什么用?如何找回它?我认为存在设计问题,您能解释一下您要实现的目标吗?
标签: security encryption cryptography