我想使用openssl_public_encrypt
加密数据并将其存储在MySQL数据库中。然后,当我需要这些数据时,我想从它来自MySQL数据库并使用openssl_private_decrypt
来解密它。在加密之后,我使用base64
对MySQL的数据进行编码,并在解密之前再次解码数据。使用PHP和openssl并将其存储在MySQL中 - 无法解密数据
这里是我使用的数据进行加密的代码和INSERT
在数据库:
<?php
require_once('default.inc.php');
mysql_connect_selectdb($host,$username,$password,$database);
function encrypt($string) {
$publickey = '-----BEGIN PUBLIC KEY-----
PUBLIC KEY HERE
-----END PUBLIC KEY-----';
openssl_public_encrypt($string,$encryptedstring,$publickey);
return $encryptedstring;
}
$number = base64_encode(encrypt('123456789'));
$qry = "UPDATE table SET number='$number' WHERE id='120006'";
$result = mysql_query($qry);
if (!$result) {
die(mysql_error());
}
?>
的default.inc.php
文件集错误报告为E_ALL并且还定义了连接mysql变量和mysql_connect_selectdb()
功能。它很好地插入到数据库中,并且没有输出到屏幕。
这里是我使用的SELECT
它从数据库和解密代码:
<?php
require_once('default.inc.php');
mysql_connect_selectdb($host,$username,$password,$database);
$key = '-----BEGIN RSA PRIVATE KEY-----
PRIVATE KEY HERE
-----END RSA PRIVATE KEY-----';
function decrypt($string,$privatekey) {
openssl_private_decrypt($string,$decryptedstring,$privatekey);
return $decryptedstring;
}
$qry = "SELECT * FROM table WHERE id='120006'";
$result = mysql_query($qry);
if ($result) {
if (mysql_numrows($result) == '1') {
$data = mysql_fetch_assoc($result);
$number = decrypt(base64_decode($data['number']),$key);
echo 'Number: '.$number;
}
else {
echo 'no rows';
}
}
else {
die(mysql_error());
}
?>
没有输出比Number:
其他屏幕。我无法弄清楚为什么它不解密。我可以在数据库中直接回显$data['number']
,它显示出基本64位编码数据的正确性,并且我可以在基本64解码后回显数据,并且在我的屏幕上显示为二进制,但是当我尝试解密时它没有输出。
MySQL的字段数VARCHAR(128)
(已经尝试VARBINARY
,BINARY
BLOB
和),VARCHAR
应base64
细,并且它是一个latin1_swedish_ci
归类。
任何帮助将不胜感激!谢谢!
它可能无助于回答你的问题,但你应该停止使用'mysql_ *'函数。他们正在被弃用。请使用[PDO](http://php.net/manual/en/book.pdo.php)(自PHP 5.1起支持)或[mysqli](http://php.net/manual/en/book)。 mysqli.php)(自PHP 4.1起支持)。如果您不确定要使用哪一个,请阅读本文(http://www.deprecatedphp.com/mysql_/)。 – Matt
@Matt他们为什么被折旧? –
@Ehanhan我认为这是关于性能和安全功能。 – Manhim