MySQL の新しい AES_ENCRYPT 関数と AES_DECRYPT 関数を使用して、PHP でソルトを使用してデータを暗号化および復号化するためのわかりやすいガイドです。
MySQL によると、AES 暗号化 (Advanced Encryption Standard) は、SQL で可逆的な暗号化と復号化を提供するために利用できる最良の方法です。
以前は Rijndael として知られていた AES_ENCRYPT 関数と AES_DECRYPT 関数が MySQL に組み込まれたため、ユーザー データを取得し、ソルトで暗号化してデータベースに保存し、後で再度抽出して復号化することができます。
ソルトを定義する
暗号化するデータにソルトを適用する必要があります。これは、暗号化アルゴリズムが使用する特別なコードで、キーと少し似た働きをします。
データを復号化するには、まったく同じキーを返す必要があります。攻撃者がデータベースにアクセスしたとしても、ソルトを知らなければ解読することはできません。
このように PHP でソルトを定義すると、SQL ステートメントに定数をより簡単に取り込むことができます。
if(!define('SALT'))
define('SALT','897sdn9j98u98jk');
AES_ENCRYPT によるデータの暗号化
MySQL データベースにデータを挿入して機密情報を暗号化するには、ソルトとともに次のようなコマンドを発行する必要があります。
INSERT INTO your_table (username,email,shoesize)
VALUES ('$username',
AES_ENCRYPT('$email','".SALT."'),
AES_ENCRYPT('$shoesize','".SALT. "'));
これにより、ユーザー名は機密ではないためプレーン テキストで挿入されますが、ソルトにアクセスせずに表示されるのを防ぐために、ユーザーの電子メールと靴のサイズが暗号化されます。
AES_DECRYPT を使用したデータの復号化
ある時点で、暗号化された形式で保存したデータの一部にアクセスする必要があります。これは、MySQL の AES_DECRYPT 関数と、使用したのと同じソルトを使用して非常に簡単に行うことができます。データを暗号化して挿入したとき。
SELECT ユーザー名, AES_DECRYPT('email','".SALT."') AS email,
AES_DECRYPT('shoesize','".SALT."')
AS Shoesize FROM your_table WHERE username ='fred';
AES_DECRYPT を使用せずに、または間違ったソルトを使用せずに暗号化されたデータを SELECT した場合、奇妙で読み取れない奇妙な文字列が得られます。これは、攻撃者がデータベースにアクセスできても、サーバーにアクセスしてソルトを表示できない場合、保存されているデータを読み取ることができないことを意味します。少なくとも、データの復号化に多大な労力を費やさなければなりません。
AES_ENCRYPT を使用した暗号化データの更新
暗号化レコードの更新は、挿入と非常によく似ています。基本的には、同じソルトを適用して AES_ENCRYPT コマンドを再発行するだけで、データが再度暗号化され、安全にロックされます。
UPDATE your_table SET email = AES_ENCRYPT('$email','".SALT."') 、shoesize = AES_ENCRYPT('$shoesize','".SALT."') WHERE username= 'fred';
AES_ENCRYPT と AES_DECRYPT の両方を使用して暗号化されたデータを検索します
検索する必要がある場合、処理は少し複雑になります。暗号化されたデータを暗号化されていない形式で表示します。
電子メール アドレスを使用してユーザーを検索したいとしますが、それをデータベース内で暗号化していたとします。まず、検索する電子メール アドレスを AES_ENCRYPT とソルトで暗号化する必要があります。次に、AES_DECRYPT を使用して MySQL がそれを復号化し、読み取り可能な形式で返すようにする必要があります。
これは、次のようなコードを使用して実現できます:
SELECT user_username,
AES_DECRYPT(email,'".SALT."') AS email,
AES_DECRYPT(shoesize,'".SALT."') AS Shoesize
FROM your_table WHERE
(email = AES_ENCRYPT('$q','".SALT."'));
これでほとんどすべてです。 AES 暗号化機能の詳細については、MySQL Web サイトで確認できます。