php - 添加 MCrypt 的 AES-CBC 加密后数据未保存到数据库或未正确解密

标签 php mysql encryption aes mcrypt

我写的加密脚本有问题。我有数百个输入,因此我使用桶排序算法作为“脚本内”数据库,以避免处理数百个 MySQL 列的麻烦,更不用说它节省了代码空间。数据存储在 SQL 数据库的一列中。条目由 ' 分隔,该条目中的变量由 > 分隔。这就是为什么我用字符串替换加密的最终结果......以避免产生额外的分隔符。

加密:

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
$key = pack("H*", "**64CharacterStringHere**");

$value = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $value, MCRYPT_MODE_CBC, $iv);

$value = $iv . $value;

$value = str_replace (">", "9Y6SnNmOBl", $value);
$value = str_replace ("'", "SxsNEpBe18", $value);   

解密:

$value = str_replace ("9Y6SnNmOBl", ">", $value);
$value = str_replace ("SxsNEpBe18", "'", $value);

$iv = substr($value, 0, 16);
$value = substr($value, 16);

$key = pack("H*", "**64CharacterStringHere**");

$value = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $value, MCRYPT_MODE_CBC, $iv);

如果我从我的代码中省略这个片段,它会完美地工作。数据显示和保存正常。但是,如果我添加这段代码,有时数据根本不会被保存,并且如果它至少有一个变量由于某种原因没有被解密,即使我 100% 确定该函数正在每个变量上运行,因为该功能不仅仅是加密和解密。

我完全不明白为什么会这样。

MySQL 查询:

$new_accountant = "'" . $var_1 . ">" . $var_2;
$new_string = $string . $new_accountant;

$new_entry_query = 'UPDATE phone_tree SET string="' . $new_string  . '" WHERE id="' . $userid . '";';
mysql_query($new_entry_query);

在上面的脚本中,$string 由一个 MySQL 查询定义,该查询获取包含目前所有数据的列的当前值。

我现在正在弄乱它。大约有一半的时间它根本不保存,而当它保存时,大约有一半的时间变量没有被正确解密。

我怀疑这与我如何存储 IV 有关...它与变量有关,但我不知道我在做什么是一个问题。

最佳答案

在我看来,您的 MySQL string 列是用 varchar(nnn) 数据类型定义的。对吗?

如果是这样,我建议您在将加密 Material 存储到 MySQL 之前对其进行 base-64 编码,然后再进行 base-64 解码?这是加密信息传输和存储的常见做法。它使您的 Material 字符串安全。 MySQL 可能会破坏您的二进制数据。

base-64 字符集(由在 php 中实现的 base-64 的 MIME 版本使用)仅包含 7 位 ASCII 字符。它包括数字、大小写字母和字符+ / =。这很好,因为您选择的分隔符 (> ') 不会出现在编码文本中,因此您可以摆脱符号填充 str_replace ("9Y6SnNmOBl", ">", $value) 代码。

在编码时执行此操作,并跳过符号填充。

$value = base64_encode($iv . $value);

在解码时执行此操作,并跳过符号取消填充。

$value = base64_decode($value);
$iv = substr($value, 0, 16);
$value = substr($value, 16);

这会使您的加密数据比其他方式大 1.3 倍。这在现代大容量存储价格中并不算多,而且是为简单性而付出的合理价格。如果它呈现出无法逾越的成本障碍,您可以研究 MySQL 中的压缩行格式。

关于php - 添加 MCrypt 的 AES-CBC 加密后数据未保存到数据库或未正确解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30424026/

相关文章:

php - 使用 PDO 以只读方式打开 SQLite3?

php - HTML Form 到 PHP 如何返回一个值而不是显示文件?

mysql - 获取 LEFT JOIN 中共同好友的数量

php - 如何使用 PHP 在 html 中使用 SELECT 标记查询我的 SQL 数据库

python - 使用 RSA 算法进行编码解码时图像数据被损坏

php - 登录后 Laravel 路由不起作用

php - 调用未定义的函数 mysqli_result()

php - 在唯一索引上检测已经插入的数据mysql

java - response.sendRedirect 在 app2 中接收时用加密 URL 中的空格替换 +?

java - vbscript 上的 aes/rijndael 自定义 key