我想使用openssl_public_encrypt
加密数据并将其存储在MySQL数据库中。然后,当我需要数据时,我想从MySQL数据库中SELECT
并使用openssl_private_decrypt
来解密它。在加密后,我使用base64
对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('1234567890123456'));
$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
整理。
任何帮助将不胜感激!谢谢!
答案 0 :(得分:1)
我明白了。列number
是VARCHAR(128)
但是插入的字符串的长度是172
,因此字符串的末尾被截断。没有字符串的结尾,它没有正确解密并返回NULL
。