2012-08-30 29 views
1

我想使用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)(已经尝试VARBINARYBINARYBLOB和),VARCHARbase64细,并且它是一个latin1_swedish_ci归类。

任何帮助将不胜感激!谢谢!

+1

它可能无助于回答你的问题,但你应该停止使用'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

+0

@Matt他们为什么被折旧? –

+1

@Ehanhan我认为这是关于性能和安全功能。 – Manhim

回答

1

我想通了。 number列是VARCHAR(128),但插入的字符串的长度为172,因此字符串的末尾被切断。没有字符串的结尾,它没有正确解密并返回NULL

相关问题