PDO和openssl_public_decrypt失败

时间:2016-08-29 02:56:51

标签: php mysql encryption pdo php-openssl

我正在尝试解密并将密码更新到mysql数据库表中。这样做是给我一个奇怪的错误。

  

PHP警告:PDO :: exec():SSL操作失败,代码为1. OpenSSL   错误消息:错误:0906D06C:PEM例程:PEM_read_bio:无起始行   在   ... /供应商/ robmorgan / phinx / src目录/ Phinx / DB /适配器/ PdoAdapter.php   第306行PHP警告:PDO :: exec():MySQL服务器已经消失了   ... /供应商/ robmorgan / phinx / src目录/ Phinx / DB /适配器/ PdoAdapter.php   第306行PHP警告:PDO :: exec():读取结果集时出错   标题   ../vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php   在第306行

  • 使用私钥加密密码。
    • openssl_private_encrypt函数用于加密。
  • 使用openssl_public_decrypt
  • 完成解密
  • 加密以及插入数据库工作正常
  • 解密以及更新不起作用。 PDO :: exec失败了 原因
  • 我使用的平台是Ubuntu,PHP 5.6.24-1 + deb.sury.org~xenial + 1
  • 加密 - 插入,解密 - 更新是操作的顺序。
  • 在执行加密和解密之前打开Mysql连接

加密解密代码:

 function processPlainText($plainText, $action) {
        $cryptText = '';
        $res = 'encrypt' == $action ? openssl_get_privatekey($this->keyContents) : openssl_get_publickey($this->keyContents);
        $action = 'encrypt' == $action ? 'openssl_private_' . $action : 'openssl_public_'.$action;

        $action($plainText, $cryptText, $res);
        openssl_free_key($res);
        return $cryptText;
    }

非常感谢对此问题的任何见解。

有效的代码:

$pdo = getMysqlPdoInstance(); //get pdo instance using ssl
$id = 101;
$plainText = 'abcd';
$password = processPlainText($plainText, 'encrypt');
$count = $pdo->exec(sprintf("UPDATE table set password =  '%s' WHERE id = %d", $password, $id));
print("Updated $count rows.\n");

失败的代码:

$pdo = getMysqlPdoInstance(); //get pdo instance using ssl
$id = 101;
$password = processPlainText($encryptedPassword, 'decrypt');
$count = $pdo->exec(sprintf("UPDATE table set password =  '%s' WHERE id = %d", $password, $id));
print("Updated $count rows.\n");

由于

1 个答案:

答案 0 :(得分:2)

使用SSL进行Mysql连接后,你点击bug,用patch(“openssl_decrypt触发PDO中的错误”)解析为PHP 7.1,还没有后向移植。在撰写本文时的最后一条评论中,可以找到解决方法的说明:

  

..请在app /脚本中的openssl_pkey_get_public之后调用openssl_error_string()。

在你的函数中,如果你不能移动到PHP7.1,将while(openssl_error_string() !== false);放在openssl_free_key()之上。

在您的评论中,您怀疑是正确的,当使用openssl_public_decrypt时,“PDO在某种程度上面临[a]问题。”