Php 我必须为数据库中使用AES-256-CBC加密的字符串指定的长度是多少?

Php 我必须为数据库中使用AES-256-CBC加密的字符串指定的长度是多少?,php,mysql,encryption,aes,Php,Mysql,Encryption,Aes,我正在使用AES 256 cbc方法加密我的文件。 我正在加密的列称为“Name”。 在加密之前,我在phpmyadmin中将'Name'的varchar长度设置为20。当我尝试加密时,我看到它很短,并且整个加密字符串没有被插入到数据库中。 因此,我将varchar的大小更改为50,但长度仍然很小。 我还得为其他专栏写这篇文章。如何确定“Name”列的有效长度 从下面的例子可以看出,我在加密中使用了随机化IV $encryptionMethod = "AES-256-CBC"; $secretH

我正在使用AES 256 cbc方法加密我的文件。 我正在加密的列称为“Name”。 在加密之前,我在phpmyadmin中将'Name'的varchar长度设置为20。当我尝试加密时,我看到它很短,并且整个加密字符串没有被插入到数据库中。 因此,我将varchar的大小更改为50,但长度仍然很小。 我还得为其他专栏写这篇文章。如何确定“Name”列的有效长度

从下面的例子可以看出,我在加密中使用了随机化IV

$encryptionMethod = "AES-256-CBC";
$secretHash = "25c6c7ff35b9979b151f2136cd13b0ff";
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($encryptionMethod));

//To encrypt
$encrypted = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash,false,$iv);

$encryptedMessage =    $encrypted . ':' .base64_encode($iv);
在解密过程中,我使用

$parts = explode(':', $encryptedMessage);
// Decrypt the data
$decryptedMessage = openssl_decrypt($parts[0], $encryptionMethod, $secretHash, 0, base64_decode($parts[1]));

echo $decryptedMessage;

由于IV被附加到加密字符串中,如何计算需要在数据库中为列“Name”定义的长度。

AES的块大小是16字节,因此您需要

  • 输入的大小,四舍五入到16的最接近倍数
  • 另外,如果输入已经是16的倍数,则PKCS#5填充的块大小为1
  • 加上16个字节用于IV
请注意,这不一定适用于其他密码模式1

因此,对于20个字节的输入,您总共需要48个字节。但是,您也在对结果进行base64编码,这需要至少多33%的空间(即,如果您关心空间,则应该存储原始字节)

在编码之前,您应该始终进行连接,否则您经常会使用多个填充字节序列浪费空间。如果您的输入长度为20字节,那么对32字节的密文进行编码会产生44字节,对IV进行编码会产生24字节(两者都需要填充)

编码前连接也不需要分隔符,因为IV的长度是已知的



1 AEAD密码,如GCM,通常优于CBC,但显然需要更多空间来存储身份验证哈希。

什么是
echo strlen($encrypted)说什么。。。另外,由于长度似乎取决于
$text
变量,因此这是固定长度吗?如果不是,您的数据库不应该使用文本或BLOB的数据类型吗?@GetSet yes,即使长度取决于$TEXT。“Name”列的$text是20个字符的预加密。因为名字通常是20个字符。如果是这样的话,我不应该只计算加密后的名称长度,因为预长度小于20个字符吗?然后把这个值放到数据库里?