3

で暗号化されたデータを格納する MySQL テーブルがありますopenssl

friendsfieldsという名前の MySQL テーブルがあるとしますid, name, surname

フィールドを暗号化したいだけですname。だから私はそれを使用して暗号化しopenssl_public_encrypt、それをテーブルに保存します。それはうまくいきます。

レコードを読み取る必要がある場合は、それを選択して復号化nameopenssl_private_decrypt、読み取ることができます。また、正常に動作します。

ここに私の問題があります。すべてのレコードを見つける必要があるとしましょうname = 'carlos'

私が最初にしたこと(私はopensslの初心者です)は、'carlos'その値を暗号化して条件として使用することでした:

<?php
    openssl_public_encrypt('carlos', $encrypted, $myPublicKey);
    $query = 'SELECT * FROM friends WHERE name ="' . $encrypted . '"; ';
?>

しかしopenssl_public_encrypt、同じ入力に対して常に異なる値を返すことに気付きました。したがって、最初の暗号化された値を複製できません。

そのフィールドを条件として使用することは不可能だと今私は考えています。

質問: MySQL でフィルター処理の条件として openssl で暗号化されたフィールドを使用する方法はありますか?

4

1 に答える 1

1

openssl_public_encrypt()同じ名前の出力は毎回異なるため、これは機能しません。

検索可能なフィールドの場合、同じ名前に対して常に同じ値を生成する SHA1 または MD5 を使用して、そのフィールドのハッシュ化された列を追加することを検討できます。

$hashed_name = sha1('carlos');
$query = sprintf("SELECT * FROM friends WHERE name_hashed = '%s'", $hashed_name);

ハッシュの衝突がないことを確認するには、クエリ結果の各行も検査する必要があります。

最大の欠点は、INSERT および UPDATE ステートメントごとに、ハッシュ バージョンも維持する必要があることです。

偏執的だと感じる場合は、キー付きハッシュを使用してhash_hmac()、秘密鍵を渡すこともできます。

于 2013-06-29T00:53:12.617 に答える