我正在创建一个具有加密值的数据库表,比如用户:
假设John加密是U2FsdGVkX193AOGlBRE1RNScJRGN9vSB4erIljJwaKw=。
UserId | Name
------ | --------------------------------------------
1 | U2FsdGVkX193AOGlBRE1RNScJRGN9vSB4erIljJwaKw=Johnny将被加密为U2FsdGVkX19lYDuvuBg3BzTnZro4J6zKoo9s/TLeiPU=。
UserId | Name
------ | --------------------------------------------
1 | U2FsdGVkX193AOGlBRE1RNScJRGN9vSB4erIljJwaKw=
2 | U2FsdGVkX19lYDuvuBg3BzTnZro4J6zKoo9s/TLeiPU=如何搜索以Jo开头的名称?
我在考虑储存:
NameStub | UserId
-------- | ------
Jo | 1
Jo | 2
Joh | 1
Joh | 2
John | 1
John | 2
Johnn | 2
Johnny | 2我现在可以做像'Jo%','Joh%'这样的搜索,两者都包括两个用户。
我可以从上面看到一个明显的安全缺陷,任何人都可以映射出像Jo或Joh这样的存根。
所以我决定存储加密的存根:
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,然后查询匹配的存根和任何具有该存根名称的相关用户。
注意:
如果我在这里缺少一些基本的东西,我需要理解。
发布于 2019-12-03 05:11:31
别这么做!
我假设"TDE“是微软透明数据加密。TDE与你的问题无关。TDE加密整个数据库,对数据库用户或连接到数据库的其他客户端来说是“透明的”。TDE所保护的是脱机访问数据库中的数据的对手,即通过数据库文件的副本或加密数据的副本,但也不需要访问加密数据所用的加密密钥。假设攻击者窃取了数据库的备份,例如窃取包含数据库数据或日志文件的备份磁带盒。如果攻击者能够访问配置了TDE的活动数据库,而数据库系统不拒绝它们访问受保护的数据,那么他们可以访问其中的任何数据(除了TDE之外,这些数据都不是加密的)。
搜索加密字段值的最安全方法是首先解密所有要搜索的字段值。理想情况下,您应该直接在数据库中这样做,例如在存储过程或函数中。攻击者似乎不太可能读取数据库进程(Es)的内存,但也无法访问用于加密数据库中数据的加密密钥(S)。
存储加密的“存根”或子字符串的想法可能会大大削弱安全性。这是对这个站点上的另一个问题的一个很好的回答,它似乎在某种程度上概括了您的问题:
这个答案指出了这种方法削弱安全性的一个重要原因:
充其量,您可以做的是实现确定性加密,这样,给定记录值的加密总是会产生相同的加密结果。这泄露了少量的信息(如果两个记录的内容相同,那么尽管存在加密层,这也会显示出来);另一方面,它允许精确的搜索:加密要搜索的值,并对加密的值使用索引。
您无法创建加密值的索引,而不暴露(可以看到这些加密值的人)相同值是相等的。通常,对值进行加密时,每个特定实例或某个值的出现都是唯一的盐类,但结果之一是,相同明文的任意数量的实例都将使用不同的盐类进行加密,从而产生不同的加密值。这就是为什么解密要搜索的值-在搜索之前-可能是最好的选择,如果您真的需要存储这些值在默认情况下加密,即使是授权的数据库用户。
请注意,即使对精确匹配的搜索也存在同样的弱点,即即使您只是为执行精确匹配的搜索而对加密的值进行索引。事实上,对于我刚才引述的两句话,下面的句子是:
然而,应该不惜一切代价避免子字符串搜索。
(这指的是加密子字符串的索引。)
加密数据索引的K233算法
但是--如果您决定削弱上面描述的安全性是您愿意接受的,那么在密码学上,这个相关堆栈溢出问题的前两个答案建议使用MAC算法生成要搜索的字段的索引版本:
这个答案在上述同样的问题上建议仔细考虑使用格式保护加密算法,注意的是在知情的情况下使用一类相对较新的算法,因此可能容易受到尚未公开知道的攻击。
在这句话中,@AlphaD建议考虑使用“可搜索对称加密”算法。这应该比考虑一种保存格式的加密算法更谨慎。SSE算法是如此的新,以至于当我检查时,甚至连维基百科的页面都没有。
https://security.stackexchange.com/questions/222194
复制相似问题