首页 > 解决方案 > 在 PHP PDO 中使用 AES_ENCRYPT CBC 模式

问题描述

我可以AES_ENCRYPT()在 MySQL 本身中使用 MySQL 的功能。

以下是我用来启用它的步骤:

1) 将以下行添加到 /etc/my.cnf 以使用 CBC 模式

[mysqld]
block_encryption_mode=aes-256-cbc

2) 重启 MySQL 3) 检查它是否在 MySQL 中工作:

SELECT @@session.block_encryption_mode;

4)创建随机IV:

SELECT RANDOM_BYTES(16);

5)将IV存储在安全的地方并在MySQL中设置@iv

SET @iv = 'output from above'

6)测试在MySQL中插入数据

UPDATE some_table
SET column_name = HEX(AES_ENCRYPT("data here", 'enc key here', @iv))
WHERE id=1;

这很好用。我可以用 tha 更新列

但是,当我尝试从 PHP PDO 添加数据时,出现以下错误:

HY000 1882 The initialization vector supplied to aes_encrypt is too short. Must be at least 16 bytes long

这是一个查询:

UPDATE session_data SET
    session_url=:session_url,
    session_password=:HEX(AES_ENCRYPT(:session_password), :enc_key, @iv),
    session_creation_datetime=now()
    WHERE session_id=:session_id

该查询在没有 AES_ENCRYPT() 的情况下工作正常。我怀疑在 PHP PDO 查询 中使用@iv是问题所在。

有谁知道这是否属实以及是否有另一种方法可以从 PHP 访问 MySQL 中的@iv?

标签: phpmysqlencryptionpdoaes

解决方案


推荐阅读