使用PHP和openssl并将其存储在MySQL中-可以';t解密数据


Using PHP and openssl and storing it in MySQL - can't decrypt data

我想使用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)(已尝试过VARBINARYBINARYBLOB),VARCHAR应该可以用于base64,并且它是latin1_swedish_ci排序规则。

如有任何帮助,我们将不胜感激!谢谢

我想明白了。列numberVARCHAR(128),但插入的字符串的长度是172,因此字符串的末尾被截断。如果没有字符串的末尾,它就无法正确解密,并返回NULL