背景
未経験エンジニアとして勉強を始めて2ヶ月経ったところで、ログイン処理を試しに作っています。
その中でパスワードの暗号化クラスを作ったので、なるべく敷居を下げて初心者目線で紹介。
なぜ暗号化を行うの?
ユーザーが登録を行う際にパスワードを入力します。その情報がデータベース(DB)に保存されます。その際に生のパスワードを保存しておくと、DBが仮に攻撃されてしまった際にパスワード情報が盗まれてしまいます。もし、ユーザーが同じパスワードを別サイトでも利用していた際に大変なことになってしまうので、データ保護の観点から暗号化を行います。
どうやってするの?
keyword
crypt関数
使い方→crypt();
crypt — 文字列の一方向のハッシュ化を行う 引用
わかりやすく説明すると、引数で文字列を渡してあげると規則性のない文字列を自動で生成してくれるよ、という関数です。
例)
$salt = 'asdfghjkl';
$password = crypt($salt);
echo $password;
// 結果 $1$FtuPJt0B$4eu1CwprtGZXnJEWkfsJO/
実例
<?php
class encryptedPassword
{
const SALT = 'qwertyuiop';
public function makePassword($password)
{
crypt($password, self::SALT);
}
}
crypt関数に引数は1つでなくても大丈夫です。
より難解な暗号にするため、SALTという定数を与えることにします。
取得の際にパスワードが合っているか判定するためには、
class accessDB
{
const SALT = 'qwertyuiop';
public function makePassword($password)
{
crypt($password, self::SALT);
}
public function fetchData($loginId, $password)
{
$encryptedPassword = $this->makePassword($password); //メソッド内で暗号化
$sql = 'SELECT * FROM user WHERE login_id = :login_id AND password = :password'; //PDOを使用
$sth = $this->pdo->prepare($sql);
$sth->execute([':login_id' => $loginId, ':password' => $encryptedPassword]); //DBのパスワードテーブルカラムから暗号化されたものと等しいものを取得
return $sth->fetch(PDO::FETCH_ASSOC);
}
}
fetchData
メソッドの引数で生のパスワードを渡しメソッド内で同じ暗号化を行います。
もし暗号化されたパスワードに一致するものがなかったらデータを取得できないため、パスワードが合っているか判定できます。
感じたこと
パスワードの暗号化はおそらく必要になってくる知識だろうし、簡単にできる処理だったのでサクッと学べてよかった。
超初心者の僕でもすんなりと納得することができました。
2018/05/25 修正
暗号化とういう言葉の意味は「復号が可能なこと」を指すとご指摘をいただきました。
今回の例の場合、開発者側はパスワードを復号できず暗号にする一方向の動きなため、タイトルをハッシュ化と変更します。