使用PHP PDO将AES_ENCRYPT插入MySQL数据库

3

我正在尝试使用AES_ENCRYPT和CBC加密模式将数据值插入MYSQL时进行加密:

SET @@session.block_encryption_mode = 'aes-256-cbc'; 

如果我直接在SQL中插入数据,那么它会成功插入而没有任何问题。
但是,如果我使用准备好的语句(PDO)通过PHP插入数据,则数据不会插入到数据库中,我也没有收到错误信息,并且返回的最后一次插入ID为0
如果我删除AES_ENCRYPT部分,它就可以成功插入数据。
完整代码如下:
$sql .= "SET @IV = RANDOM_BYTES(16);";
        $sql .= "INSERT INTO ". TABLE_NAME. " (record_created, name, dob, someinfo, iv) 
            VALUES (
                NOW(), 
                :name,
                AES_ENCRYPT(:dob, :key, @IV), 
                AES_ENCRYPT(:someinfo, :key, @IV),  
                @IV); ";



        try {
            $db = Employee::getConnection();
            $stmt = $db->prepare($sql);  

            $stmt->bindParam(':key', $key);
            $stmt->bindParam(':name', $employee->name);
            $stmt->bindParam(':dob', $employee->dob);
            $stmt->bindParam(':someinfo', $employee->someinfo);

            $stmt->execute();
            $employee->id = $db->lastInsertId();
            $db = null;
            echo json_encode($employee); 

@u_mulder,不是的。它有什么问题吗? - input
为什么在 name 后面有一个 ' - u_mulder
@u_mulder,抱歉我的错。我不知道我怎么错过了它。我已经删除了它,但是问题仍然存在。lastInsertId()返回0,数据没有被插入。 - input
所以要检查错误。据我所知,$stmt->errorInfo - u_mulder
@u_mulder,抛出错误 Undefined property: PDOStatement::$errorInfo - input
显示剩余2条评论
1个回答

3

您不能像在PhpMyAdmin中那样使用分号来分隔多个查询。 以下是一种可能更好的方式:

<?php
$aeskey = '4ldetn43t4aed0ho10smhd1l';

$sql = "INSERT INTO ". TABLE_NAME. " (record_created, name, dob, someinfo) 
            VALUES (
                NOW(), 
                :name',
                AES_ENCRYPT(:dob, '".$aeskey."'), 
                AES_ENCRYPT(:someinfo, '".$aeskey."'));";

$db = Employee::getConnection();
$stmt = $db->prepare($sql);  
$stmt->bindParam(':name', $employee->name);
$stmt->bindParam(':dob', $employee->dob);
$stmt->bindParam(':someinfo', $employee->someinfo);
$stmt->execute();
$employee->id = $db->lastInsertId();
$db = null;
echo json_encode($employee); 

谢谢您的回复。我已经尝试了这种方式,它可以工作,但是我想使用CBC加密模式,这需要IV作为参数。我该如何输入? - input
我正在做同样的事情,可能你必须在表中创建另一列来存储IV,然后为每个项目生成一个随机的IV,并将其与值一起存储。我这么做是因为我还没有能够在PHP PDO中使用@iv。 - raw-bin hood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接