2

openssl_public_encryptデータを暗号化し、MySQL データベースに保存するために使用したいと考えています。次に、データが必要になったときにSELECT、MySQL データベースからデータを取得し、それを使用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']、base 64 でエンコードされたデータとして正常に表示されます。また、base 64 でデコードされた後にデータをエコーすることができ、画面上でバイナリとして正常に表示されますが、復号化しようとすると出力はありません。

MySQL フィールド番号は(VARCHAR(128)試行済みVARBINARYBINARYおよびBLOB)です。VARCHARbase64latin1_swedish_ci

どんな助けでも大歓迎です!ありがとう!

4

1 に答える 1

1

私はそれを考え出した。コラムnumberVARCHAR(128)挿入された弦の長さでしたが、弦172の端が切れていました。文字列の終わりがないと、正しく復号化されず、が返されNULLました。

于 2012-08-30T20:24:31.377 に答える