使用确定性算法对布尔值进行加密的最安全方法



在我的一项学校作品中,我需要使用确定性算法(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

最新更新