Webエンジニア 新人日記

Webエンジニアになりました。元々はCOBOLやらBASICやらでプログラムしてました。C言語やVisualBasicは趣味でやっていましたが、久々に現場復帰ということです。資格はエンベデッドスペシャリスト、DBスペシャリスト、ネットワークスペシャリスト、セキュリティスペシャリスト、システムアーキテクト、プロジェクトマネージャ他を所有

【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'];
  }
}