
もくじ
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文を書いていくと大変なことになるのでまとめてみました。


コメント