【问题标题】:What is the length I must specify for string encrypted with AES-256-CBC in the database?我必须为数据库中使用 AES-256-CBC 加密的字符串指定长度是多少?
【发布时间】:2020-07-28 05:30:49
【问题描述】:

我正在使用 AES 256 cbc 方法来加密我的文件。 我正在加密的列称为“名称”。 之前在加密之前,我在 phpmyadmin 中将 'Name' 的 varchar 长度设置为 20。当我尝试加密时,我发现它很短,并且整个加密字符串没有插入到数据库中。 所以我将 varchar 的大小更改为 50,但长度仍然很小。 我也必须为其他专栏这样做。如何确定“名称”列的有效长度。

我在加密中使用了随机 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 已附加到加密字符串,我将如何计算需要在数据库中为“名称”列定义的长度。

【问题讨论】:

  • echo strlen($encrypted); 说什么? ...此外,由于看起来长度将取决于您的 $text 变量,这是固定长度吗?如果不是,您的数据库不应该使用 TEXT 或 BLOB 数据类型吗?
  • @GetSet 是的,即使长度取决于 $text。我的“名称”列的 $text 是 20 个字符的预加密。由于名称通常包含 20 个字符。所以如果是这样的话,我不应该只计算加密后的名称长度,因为预长度小于 20 个字符吗?并将该值放入数据库中?

标签: php mysql encryption aes


【解决方案1】:

AES 的块大小是 16 字节,所以你需要

  • 输入的大小,四舍五入到最接近的 16 倍数
  • 另外,如果输入已经是 16 的倍数,则为 PKCS#5 填充一个块大小
  • 加上 16 个字节用于 IV

请注意,这不一定适用于其他密码模式1。

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

您应该始终在编码之前进行连接,否则您经常使用多个填充字节序列浪费空间。如果您的输入是 20 字节长,则对 32 字节密文本身进行编码会产生 44 字节,而对 IV 进行编码会产生 24 字节(两者都需要填充)。 Concatenating before encoding produces only 64 bytes.

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


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

【讨论】:

    猜你喜欢
    • 2014-04-10
    • 2015-02-05
    • 1970-01-01
    • 2021-05-11
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多