加密问题



我在这里问了一个问题,我设法部分实施了建议。现在,在删除AES-256加密后,数据存储在二进制字段(VARBINARY(500((中,然后剩下AES-128(默认(CodeIgniter加密。

但是,我有一些问题,我找不到答案,因为我找不到有关此主题的文章,因此,如果有人可以回答我的问题,或者将我指向一本书或任何其他文献,以便进一步阅读,我会非常感谢。

  1. 为什么必须将加密数据存储在二进制类型字段中?将其存储在longtext或varchar中有什么问题?这会使加密毫无价值吗?

  2. 为什么我必须首先对变量进行编码,然后在将数据存储在二进制字段中时进行加密,而当我将数据存储在Varchar字段中时,我不必这样做?

    base64_encode($clientName);
    $encClientName = $this->encryption->encrypt($clientName);
    
  3. 在我以前的问题中(请参阅顶部的链接(,建议我使用nonce。由于我不知道如何将其与CodeIgniter库一起使用,因此我没有实现该部分。这会使我的数据不太安全吗?任何人都可以发布任何如何与CodeIgniter一起使用NONCE的代码?

再次,将深深理解有关此主题的任何链接(使用PHP存储加密数据(。

为什么必须将加密数据存储在二进制类型字段中?将其存储在longtext或varchar中有什么问题?这会使加密毫无价值吗?

加密数据是二进制的。它经常包含文本编码中无效的字节序列,使其无法插入一个期望字符串的列中(例如varchar或text(。

您可能想要的数据类型是varbinary(类似于varchar,但不类似于字符串(或斑点(同样,但对于文本,也有中词,longblob等(。

为什么我必须首先对变量进行编码,然后在将数据存储在二进制字段中时进行加密,而当我将数据存储在Varchar字段中时,我不必这样做?

你不。这是向后的。

如果您要使用字符串类型列存储加密数据,则可以通过base64编码加密后的base64来"伪造"。但是,使用二进制型列,您仍然更好,这时您不需要任何其他编码。

在我以前的问题中(请参阅顶部的链接(,建议我使用nonce。由于我不知道如何将其与CodeIgniter库一起使用,因此我没有实现该部分。这会使我的数据不太安全吗?

根据我在文档中看到的内容,我认为CodeIgniter加密库默认情况下为您处理此操作。您不必再做任何其他事情。

除了Duskwuffs答案外,我还从与加密相关的观点上介绍了您的问题。他刚刚在我做之前就设法发布了一分钟:(


加密数据必须存储在二进制类型字段中,因为字符编码的工作方式。我建议您阅读,如果您还没有阅读,乔尔·斯波尔斯基(Joel Spolsky(的这篇出色的文章很好地详细介绍了。

重要的是要记住,加密算法在原始二进制数据上运行。也就是说,有点字符串。可以通过多种方式来解释的字面1和0。您可以将这些数据表示为无符号字节值(255,255(,十六进制(0xff,0xff(,无论如何,它们实际上只是下面的刻度字符串。加密算法的另一个属性(至少是好的(是,加密的结果应与随机数据没有区别。也就是说,给定一个具有相同长度的随机数据的加密文件和csprng的斑点,您应该无法确定哪个是。

现在,让您想将这些数据存储在期望UTF8字符串的字段中。因为我们在此字段中存储的位字符串可以包含字节的任何可能的序列,所以正如我们上面讨论的那样,我们不能假设我们存储的字节序列表示实际有效的UTF8字符。这样做的暗示是,对UTF8编码然后解码为二进制的二进制数据不能保证为您提供原始的二进制数据。实际上,它很少会。


您的第二个问题也与编码有关,但是这里的编码是base64。Base64是一种编码,非常适合(实际上,它是为(二进制数据的。base64是在大多数实现中使用常见字符(A-Z,A-Z,0-9和 ,/(表示二进制数据的一种方法。我愿意敢打赌,您使用的encrypt功能使用base64_decode或它调用的功能之一。您实际上应该感兴趣的是encrypt函数的输出是base64字符串还是实际二进制数据,因为这会影响您在数据库中使用的数据字段类型(例如,二进制与VARCHAR(。


我相信您的最后一个问题您说您正在使用CTR,因此以下情况适用于CTR使用的NONCE。

CTR通过加密计数器值来起作用,然后使用您的数据XOR-XOR-xor-th这个加密的计数器值。该计数器值由两件事,即nonce和计数器的实际值组成,通常从0开始。从技术上讲,您的nonce可以是任何长度,但我相信共同的值是12个字节。因为我们正在讨论AE,所以计数器值的总大小应为16个字节。也就是说,nonce的12个字节和4个字节的计数器。

这是重要的部分。每个加密操作都应:

  • 生成新的12个字节nonce用于该操作。
  • 您的实施应添加计数器并执行实际的加密。
  • 一旦您拥有最终的密文,请将nonce预先到此ciphertext上,以便结果为 len(ciphertext) + 12) bytes long。
  • 然后将此最终结果存储在您的数据库中。

使用静态nonce重复一个nonce或使用单个12个字节nonce执行超过2^32的加密操作将使您的ciphertext脆弱。

最新更新