PHPの話ですが、
パスワードをデータベースに記録する機会があってちょっと調べました。
生で記録するなというのはよく聞く話ですが、
・じゃあ暗号化して登録すればいいのか、
・その場合パスワードチェックは、(ワードを暗号化)=(記録しておいた暗号化済みワード)みたいなことをすればいいのか?
みたいな考えもありましたが世の中はもっと進んでいてpassword_hash()という関数が存在しました。
これはpassword_verify()という関数とセットで使うもので、
$encrypted = password_hash($input); $is_matched = password_verify($input, $encrypted);
みたいな感じで使います。暗号化された値は毎回違う値を返すので、最初に自分が考えていた暗号化したもの同士を比べても失敗します。
確かにこれなら暗号を記録する人すらもパスワードがなんなのかわからなくできます。
password_hash()が生まれた理由については良記事がたくさんあったので下記をご覧ください。
要約すると以下のような感じ。
・password_hash()という関数を用意することで将来的に暗号化アルゴリズムを変えても関数に変更がない
・ソルトを毎回違い値で入れることでテーブルを作って総当たりすることを困難にする(レインボーテーブル)
一新された PHP: 最新の PHP でのパスワード・セキュリティー
セキュリティコラム
(こちらは暗号化についての一般的なお話です。わかりやすかったので載せておきました。)
ただ暗号化された値はどんなアルゴリズムでどれだけコストをかけて、ソルトは何を使ったかすら入っているものでこれでなぜ破られないのか疑問が残りました。password_verify()ではすぐにチェックできるのになぜこれが機能するのか、調べましたがよくわかりませんでした。暗号化についてもっと深く調べる必要があるのかもしれません。(誰かこの辺のことがわかりやすく説明されている記事など教えてください。)