【PHP】PHPとMySQLを使った暗号化・復号
AES_ENCRYPTを使って暗号化する。鍵は
define("KEY", "xxxxxxxxx");
などで記述しておくと楽。本当はやり方があるんだろうけど。
PHPを使っても良かったんだけど、検索キーにする時が面倒なので。
【暗号化】
単純に暗号化するとバイナリーになるので面倒。
HEX関数と組み合わせて使う。
$sql = "INSERT INTO `student` (`name`, `email`, `pass`) "; $sql .= " VALUES (?, HEX(AES_ENCRYPT(? , '" . KEY . "')), ? )"; $stmt = $dbh->prepare($sql); //パラメーターを渡して SQL 実行 $res = $stmt->execute(array($name, $mail, $hash));
※$hashはパスワードから生成したハッシュ値
【復号】
さっきと逆で、UNHEXしてバイナリに戻してからAES_DECRYPT。
ただし、可読させたいときはそのままでは文字コードベタ打ちなのでUTF-8に文字コード変換する。単純な比較ではCONVERTする必要はないっぽい。
$sql = "SELECT `studentcd` , `name`, `pass`, "; $sql .= "CONVERT( AES_DECRYPT( UNHEX( `email` ) , '" . KEY . "' ) USING utf8 ) as mail "; $sql .= "FROM `student` WHERE AES_DECRYPT(UNHEX(`email`) , '" . KEY . "') = ? "; $stmt = $dbh->prepare($sql); if ($stmt->execute( ( array ) $mail ) ) { while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $db_hashed_pwd = $row['pass']; $_SESSION['userid'] = $row['studentcd']; $_SESSION['name'] = $row['name']; $_SESSION['mail'] = $row['mail']; } }