use*_*624 1 php mysql encryption cryptography codeigniter
我在这里问了一个问题,并设法部分实施了这个建议.在我删除aes-256加密并且保留aes-128(默认)codeigniter加密后,数据现在以二进制字段(varbinary(500))加密存储.
但是,我有一些问题,我找不到答案,因为我找不到很多关于这个主题的文章,所以如果有人能回答我的问题,或者指点我的书,或任何其他文献进一步阅读,我会非常感激的.
为什么加密数据必须存储在二进制类型字段中?将它存储在longtext或varchar中有什么问题?这会使加密变得毫无价值吗?
为什么我必须首先对变量进行编码,然后在将数据存储在二进制类型的字段中时对其进行加密,当我将数据存储在varchar字段中时,我不必这样做?
base64_encode($clientName);
$encClientName = $this->encryption->encrypt($clientName);
Run Code Online (Sandbox Code Playgroud)在我之前的问题中(请参阅顶部的链接)我被建议使用nonce.由于我不知道如何使用codeigniter库,我没有实现该部分.这会使我的数据安全性降低吗?任何人都可以发布任何片段代码如何使用nonce与codeigniter?
再次,任何关于这个主题的阅读材料的链接(用PHP存储加密数据在数据库中)将深受赞赏.
为什么加密数据必须存储在二进制类型字段中?将它存储在longtext或varchar中有什么问题?这会使加密变得毫无价值吗?
加密数据是二进制的.它经常包含在文本编码中无效的字节序列,这使得它们无法插入到需要字符串的列中(如VARCHAR或TEXT).
您可能想要的数据类型是VARBINARY(类似于VARCHAR,但不是字符串)或BLOB(同样,但对于TEXT - 还有MEDIUMBLOB,LONGBLOB等).
为什么我必须首先对变量进行编码,然后在将数据存储在二进制类型的字段中时对其进行加密,当我将数据存储在varchar字段中时,我不必这样做?
你没有.这是倒退.
如果您打算使用字符串类型的列来存储加密数据,您可以通过Base64对加密后的数据进行编码来"伪造"它.但是,您最好还是使用二进制类型的列,此时您不需要任何其他编码.
在我之前的问题中(请参阅顶部的链接)我被建议使用nonce.由于我不知道如何使用codeigniter库,我没有实现该部分.这会使我的数据安全性降低吗?
基于我在文档中看到的内容,我认为CodeIgniter Encryption库默认为您处理.你不应该做任何额外的事情.
除了 duskwuffs 的回答之外,我还从与加密相关的角度回答了您的问题。他只是在我发帖前一分钟发帖:)
由于字符编码的工作方式,加密数据必须存储在二进制类型字段中。如果您还没有阅读,我建议您阅读Joel Spolsky 撰写的这篇出色的文章,其中详细介绍了这一点。
重要的是要记住加密算法对原始二进制数据进行操作。即位串。可以用多种方式解释的字面值 1 和 0。您可以将这些数据表示为无符号字节值 (255, 255)、十六进制 (0xFF, 0xFF),无论如何,它们实际上只是下面的位字符串。加密算法(或至少是好的算法)的另一个特性是加密的结果应该与随机数据无法区分。也就是说,给定一个加密文件和一团 CSPRNG 生成的具有相同长度的随机数据,您应该无法确定哪个是哪个。
现在假设您想将此数据存储在需要 UTF8 字符串的字段中。因为我们在这个字段中存储的位串可以包含任何可能的字节序列,正如我们上面所讨论的,我们不能假设我们存储的字节序列将表示实际有效的 UTF8 字符。这意味着二进制数据编码为 UTF8,然后解码回二进制不能保证给你原始的二进制数据。事实上,它很少会。
您的第二个问题也与编码有关,但这里的编码是 base64。Base64 是一种非常适合(实际上,它是为)二进制数据而设计的编码。在大多数实现中,Base64 是一种使用常见字符(az、AZ、0-9 和 +、/)来表示二进制数据的方法。我敢打赌,encrypt您使用的函数要么使用base64_decode它调用的函数,要么使用它调用的函数之一。您真正应该感兴趣的是encrypt函数的输出是 base64 字符串还是实际的二进制数据,因为这会影响您在数据库中使用的数据字段的类型(例如 binary 与 varchar)。
我相信您在上一个问题中表示您使用的是 CTR,因此以下内容仅适用于 CTR 使用的随机数。
CTR 的工作原理是加密一个计数器值,然后将这个加密的计数器值与您的数据进行异或运算。这个计数器值由两部分组成,nonce 和计数器的实际值,通常从 0 开始。从技术上讲,您的 nonce 可以是任意长度,但我相信一个常见的值是 12 个字节。因为我们正在讨论 AES,所以计数器值的总大小应该是 16 字节。即 12 个字节的 nonce 和 4 个字节的计数器。
这是重要的部分。每个加密操作都应该:
len(ciphertext) + 12)字节长。重复随机数、使用静态随机数或使用单个 12 字节随机数执行超过 2^32 次加密操作将使您的密文容易受到攻击。
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |