在我的一项学校作品中,我需要使用确定性算法(http://en.wikipedia.org/wiki/Deterministic_encryption)来加密几个字段。
在这种特定情况下,我必须用布尔值对表进行加密。这很好,除了使用确定性算法这样做几乎毫无用处。
为什么会这样?(你可能会问)
碰巧当我对值"true"进行密码(每个示例)时,我总是得到"AB1"的密文,而当我对值进行密码时,我总是得到"SQ2"的密文。因此,我有一个填充值"AB1"和"SQ2"的表,而不是一个填充值"true"和"false"的表。任何攻击者都会立即明白我的表存储布尔值,并且他不会花很长时间来确定 AB1=true 和 SQ2=false。
这就是我想在家庭作业中防止的。为了避免这个问题,我尝试使用具有某些属性的数字。每个示例,值"true"替换为素数,而值"false"替换为非素数。因此,我的表格将充满许多不同的素数和非素数。
如果不是因为一件小事,这将是一个可以接受的解决方案:我们可以计算的素数数量是"有限的"(计算大素数需要很长时间)。在 10000000 个数的区间内,只有 664579 个是素数(只有 6.64579%)。
所以我考虑使用奇数而不是素数,但我不确定奇数的质量。我认为攻击者将能够从密码中检索"奇怪"的属性,从而进行攻击。
我对奇数的假设正确吗?还有其他解决方案吗?你们有什么想法吗?
我真的很感激任何帮助或想法,提前感谢佩德罗。
根据这些论文,CryptDB的工作原理是根据执行的查询来调整加密级别。
不执行任何查询时,所有值都使用它们所谓的Random
加密进行存储。这基本上是CBC模式下的AES,带有随机IV。由于 IV 对于所有字段都是不同的,因此所有字段都将具有不同的加密。
当他们需要对列(对于 JOIN、GROUP BY 等)执行相等检查时,他们会降级加密以Deterministic
加密。此加密级别的主要要求是给定的明文始终加密为相同的密文。因此,对于此级别,布尔列将只有两个可能的密文值。是的,这会将信息泄露给可以观察表的攻击者,但无法绕过它。相反,存储素数/非素数将不起作用:然后数据库将无法执行所需的操作。
对不起,但你需要为你的家庭作业找到另一个想法。
你可以把布尔值组当作二进制数
这里最大的误解是你没有单独加密每个值。你应该做的是将所有值打包到某种数据结构中(例如bool
数组),然后加密整个数据结构(使用CBC模式,如果你还没有这样做的话)。
的数据结构(即如何选择将表打包到单个二进制实体中)无关紧要。
好吧,我不知道这是否会对你们有所帮助,但我的最终结论是我与您的一些建议的混合。
我通过进行以下分配解决了问题:
true = 随机整数素数
false = 随机整数(非素数)
现在一个明显的问题来了:
问:如果我选择随机数,如何在不保存每个生成的数字的情况下保证它们不会重复?
答:我将随机数转换为字节,并将其与同一表的ID混合。这样,如果我生成一个随机重复的数字,我就无关紧要了,因为当我将其与 ID(唯一)混合时,我弄乱了输出。
然而,计算素数可能相当繁重,所以我将在这里发布我的报告的一小部分,其中包含其他建议:
Although we selected the property of being prime as an equivalent to the boolean of true, we could have also used other properties, such as:
<li>
<ul>
Representing a true boolean by a random odd number and
a false boolean by a random even value
</ul>
<ul>
Representing a true boolean by a sequence of numbers
that belongs to PI and a false boolean by a random
number sequence that doesn't belong to PI
</ul>
</li>
这对我来说是一个非常有趣和意想不到的挑战。我从来没有想过这么简单的事情需要这样的独创性。
我希望我的解决方案对大家有所帮助,如果您喜欢密码学,请看一下该项目:P