【问题标题】:Inserting into mysql database AES_ENCRYPT using PHP PDO使用 PHP PDO 插入 mysql 数据库 AES_ENCRYPT
【发布时间】:2015-10-24 19:22:27
【问题描述】:

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

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

如果我直接在 SQL 中插入数据,它会成功插入,没有任何问题。

但是,如果我使用准备好的语句 (PDO) 通过 PHP 插入,则数据不会插入到数据库中,并且我不会收到任何错误,并且返回的 lastInsertID 是 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); 

【问题讨论】:

  • :name',?是错字吗?
  • @u_mulder,不,不是。它有什么问题?
  • 为什么name后面有一个'?
  • @u_mulder,我的错。我不知道我是怎么错过的。我删除了它,但同样的问题。 lastInsertId() 正在返回 0 并且没有插入数据。
  • 所以检查错误。 AFAIK $stmt->errorInfo

标签: php mysql encryption pdo aes


【解决方案1】:

您不能触发多个以“;”分隔的查询就像在 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); 

【讨论】:

  • 感谢您的回复。我试过以这种方式插入,它可以工作,但我想使用需要 IV 作为参数的 CBC 加密模式。我该如何输入?
  • 我也在做同样的事情,有可能你必须在表中为IV创建另一列,然后为每个项目生成一个随机IV,并将其与值一起存储。我假设这是因为我还不能在 PHP PDO 中使用@iv。
猜你喜欢
  • 2018-08-01
  • 2014-04-17
  • 1970-01-01
  • 2017-10-20
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
相关资源
最近更新 更多