首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Microsoft透明数据加密存储字符串及其子字符串的安全性缺陷?

使用Microsoft透明数据加密存储字符串及其子字符串的安全性缺陷?
EN

Security用户
提问于 2019-12-03 02:15:19
回答 1查看 214关注 0票数 2

我正在创建一个具有加密值的数据库表,比如用户:

假设John加密是U2FsdGVkX193AOGlBRE1RNScJRGN9vSB4erIljJwaKw=

代码语言:javascript
复制
UserId | Name
------ | --------------------------------------------
1      | U2FsdGVkX193AOGlBRE1RNScJRGN9vSB4erIljJwaKw=

Johnny将被加密为U2FsdGVkX19lYDuvuBg3BzTnZro4J6zKoo9s/TLeiPU=

代码语言:javascript
复制
UserId | Name
------ | --------------------------------------------
1      | U2FsdGVkX193AOGlBRE1RNScJRGN9vSB4erIljJwaKw=
2      | U2FsdGVkX19lYDuvuBg3BzTnZro4J6zKoo9s/TLeiPU=

如何搜索以Jo开头的名称?

我在考虑储存:

代码语言:javascript
复制
NameStub | UserId
-------- | ------
Jo       | 1
Jo       | 2
Joh      | 1
Joh      | 2
John     | 1
John     | 2
Johnn    | 2
Johnny   | 2

我现在可以做像'Jo%''Joh%'这样的搜索,两者都包括两个用户。

我可以从上面看到一个明显的安全缺陷,任何人都可以映射出像JoJoh这样的存根。

所以我决定存储加密的存根:

代码语言:javascript
复制
NameStub    | UserId
----------- | ------
enc(Jo)     | 1
enc(Jo)     | 2
enc(Joh)    | 1
enc(Joh)    | 2
enc(John)   | 1
enc(John)   | 2
enc(Johnn)  | 2
enc(Johnny) | 2

其中enc(x)只是x的加密值。

在搜索Joh时,我将加密Joh,然后查询匹配的存根和任何具有该存根名称的相关用户。

注意:

如果我在这里缺少一些基本的东西,我需要理解。

EN

回答 1

Security用户

回答已采纳

发布于 2019-12-03 05:11:31

TLDRTLDR

别这么做!

TLDR

  • TDE与这个问题无关。
  • 不要这样做(索引加密字符串的加密子串)。
  • 一般不要索引加密的值。
  • 如果要这样做,请使用HMAC或其他MAC算法来生成要在索引(Es)中使用的加密值。
  • 如果您感到真的幸运,请考虑使用格式保护加密算法或“可搜索对称加密”算法,而不是使用MAC算法。

TDE

我假设"TDE“是微软透明数据加密。TDE与你的问题无关。TDE加密整个数据库,对数据库用户或连接到数据库的其他客户端来说是“透明的”。TDE所保护的是脱机访问数据库中的数据的对手,即通过数据库文件的副本或加密数据的副本,但也不需要访问加密数据所用的加密密钥。假设攻击者窃取了数据库的备份,例如窃取包含数据库数据或日志文件的备份磁带盒。如果攻击者能够访问配置了TDE的活动数据库,而数据库系统不拒绝它们访问受保护的数据,那么他们可以访问其中的任何数据(除了TDE之外,这些数据都不是加密的)。

索引加密数据

搜索加密字段值的最安全方法是首先解密所有要搜索的字段值。理想情况下,您应该直接在数据库中这样做,例如在存储过程或函数中。攻击者似乎不太可能读取数据库进程(Es)的内存,但也无法访问用于加密数据库中数据的加密密钥(S)。

存储加密的“存根”或子字符串的想法可能会大大削弱安全性。是对这个站点上的另一个问题的一个很好的回答,它似乎在某种程度上概括了您的问题:

这个答案指出了这种方法削弱安全性的一个重要原因:

充其量,您可以做的是实现确定性加密,这样,给定记录值的加密总是会产生相同的加密结果。这泄露了少量的信息(如果两个记录的内容相同,那么尽管存在加密层,这也会显示出来);另一方面,它允许精确的搜索:加密要搜索的值,并对加密的值使用索引。

您无法创建加密值的索引,而不暴露(可以看到这些加密值的人)相同值是相等的。通常,对值进行加密时,每个特定实例或某个值的出现都是唯一的盐类,但结果之一是,相同明文的任意数量的实例都将使用不同的盐类进行加密,从而产生不同的加密值。这就是为什么解密要搜索的值-在搜索之前-可能是最好的选择,如果您真的需要存储这些值在默认情况下加密,即使是授权的数据库用户。

请注意,即使对精确匹配的搜索也存在同样的弱点,即即使您只是为执行精确匹配的搜索而对加密的值进行索引。事实上,对于我刚才引述的两句话,下面的句子是:

然而,应该不惜一切代价避免子字符串搜索。

(这指的是加密子字符串的索引。)

加密数据索引的K233算法

但是--如果您决定削弱上面描述的安全性是您愿意接受的,那么在密码学上,这个相关堆栈溢出问题的前两个答案建议使用MAC算法生成要搜索的字段的索引版本:

这个答案在上述同样的问题上建议仔细考虑使用格式保护加密算法,注意的是在知情的情况下使用一类相对较新的算法,因此可能容易受到尚未公开知道的攻击。

这句话中,@AlphaD建议考虑使用“可搜索对称加密”算法。这应该比考虑一种保存格式的加密算法更谨慎。SSE算法是如此的新,以至于当我检查时,甚至连维基百科的页面都没有。

票数 3
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/222194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档