もくじ
php関連記事
PHPのmb_send_mailでメール送信時に、はしご高「髙」やたつさき「﨑」など旧漢字や丸数字の日本語文字化け対策をする
MySQL/MariaDBのデータをPHP側で暗号化・復号する
phpで10進数と16進数、2進数、8進数の変換と0埋め表記
WordPressの条件分岐タグでページを判別する
PHPでpreg_splitの文字化けを回避しながらテキストを改行ごとに区切ってHTMLメールをつくる
WordPressテーマアップロード時に「辿ったリンクは期限が切れています。 もう一度お試しください。」と表示される
PHPで画像アップロード時に比率を保ったまま縮小する
phpで郵便番号を正規表現で3桁・ハイフン・4桁で出力するfunction
phpで電話番号のハイフンを正規表現で出力するfunction
なぜデータを暗号化・復号するのか?
データベースに個人情報などを暗号化せずそのまま保存した場合、万が一データベースの情報が流出した時に第三者が見れてしまうのを防ぐためにデータを暗号化します。よくパスワードはphpのmd5でハッシュ化して保存しますね。
今回は氏名やメールアドレスなどを暗号化した後、データベースから呼び出すときに復号してデータが読めるよう元のデータに戻します。
AES_ENCRYPTとHEXを使ったINSERT文
SQL文
INSERT INTO `users` ( name ) VALUES ( HEX(AES_ENCRYPT('渡辺', 'password')) )
AES_ENCRYPTとHEXを使ったINSERT文で「渡辺」の値を暗号化して追加します。
AES_ENCRYPT・AES_DECRYPTはMySQLの暗号化関数です。
HEXという関数で16進数化して保存します。password
は任意のパスワードを設定し、暗号化・復号の際に同じPWを使用します。
16桁以内にしておくとよいそうです。
AES_ENCRYPTとHEXを使ったUPDATE文
SQL文
UPDATE `users` SET name = HEX(AES_ENCRYPT('渡辺', 'password')) WHERE `id` = :user_id
暗号化についてはINSERT文と同じ内容でUPDATE文を作成します。
暗号化後のデータはバイナリになるので、カラムの型に注意しないと正しくデータの書き込みができず、復号できません。
AES_DECRYPTとUNHEXを使ったSELECT文
SQL文
SELECT id, convert( AES_DECRYPT(UNHEX(name), 'password') USING utf8 ) as name, convert( AES_DECRYPT(UNHEX(kana), 'password') USING utf8 ) as kana FROM `users`
暗号化したデータを復号しています。
暗号化されているカラム毎に指定が必要です。
暗号化するSQL文
PHP
const PASSWORD = 'password'; function colum_enc($value) { $enc = "HEX(AES_ENCRYPT('".$value."', '".PASSWORD."'))"; return $enc; }
暗号化するカラムごとにSQL文を書いていくと大変なことになるのでまとめてみました。
復号するSQL文
PHP
function colum_dec($value) { $dec = " convert( AES_DECRYPT(UNHEX(".$value."), '".PASSWORD."') USING utf8 ) as ".$value; return $dec; }
復号するカラムごとにSQL文を書いていくと大変なことになるのでまとめてみました。
コメント