パスワードの暗号化・認証をPHPを通して学んだ(パクリまとめ)
tl;dr
認証はOpenIDとかソーシャルログイン使う。
だめならフレームワーク使う。
内容
契機
今日もPHPの講習を受けに行っていたが、ユーザー管理の実装で、
「今回はユーザー管理が主眼だから、パスワードについては簡単に実装するよ!
本ちゃんのシステムでは絶対にやらないでね!」
といった内容の記述があり、
このパスワードの認証について気になったので調べてみた。
しらべたこと
ちなみに使っていたテキストでは、sha1でハッシュ化したものをパスワードとしてMySQLにINSERTしていた。
(ハッシュ化とは、不可逆に文字やファイルを変換するもの。暗号化は復号ができるもの。)
sha1:文字、データを40桁の16進数にハッシュ化する。
同じものであれば、出力されるハッシュは同じになる。そのため、ファイルが正しいものであるかの判断に使われることもある。
ただ、下記の記事のように、GoogleがSHA1に勝った(超意訳)という話もあり、セキュリティ上心配だそうな。
で、PHPでは選択肢に出てくるのが、password_hash()関数。
これはハッシュ化する度に、違うハッシュが吐き出されるというもので、認証にはpassword_verify()という専用関数を用いるそうな。
でも、このpassword_hashについても、やはり限界はあるわけで。
結論、餅は餅屋
結局、100%の安全なんてものはないわけですが、極めて安全に近いのは、セキュリティを専門にしたものを使うという手段なわけです。
その手段としては、
- OpenIDやソーシャルログインを使う
認証についてはプロにやっていただき、我々はトークンのみ頂いてお仕事させていただきます。 - フレームワークを使う
クラウドを毛嫌いするような社長とかがいるような会社なら、自社実装にするしかありませんね。
公式の関数で足りないならフレームワーク。これも専用のものを使うと安心ですね。
参照というか丸パクリ元
ナウいエンジニアについての記事(戸田奈津子訳)でもお世話になってます。