PHPでもくもく開発している「うったむ」です。PHPに関することの中で、この記事では「安全にサービスを利用してもらう」ために必要な「パスワードのハッシュ化」についてまとめてみました。
ハッシュ化とは
何かのデータをアルゴリズムにより、適当な文字列に置き換えて、元のデータを自分や他の人が推測できなくすることです。
ハッシュ化するためには、ハッシュ関数を使います。この記事でご紹介するpassword_hash関数がその一つです。
ハッシュ化をなぜしないといけないの?
ユーザ登録画面を作る場合「名前、メールアドレス、パスワード、パスワードの確認」といったものを用意しますね。
名前だけなら良いですが、パスワードは他の人に絶対知られたくないです。
直にパスワードをデータベースに保存すると、データベースにもし攻撃されたら、簡単に個人情報を盗むことができます。
ですから、セキュリティの理由ゆえに、データベースにパスワードをそのまま保存せず、意味不明な文字列にしましょう。
安全のため【ハッシュ化する理由】
ハッシュ化しないでパスワードをそのままデータベースに保存すると、外部の悪い人に盗まれる可能性があります。結果、悪用されてしまうのです。
サイト運営者にもパスワードを知られないようにするため、ハッシュ化します。安心してユーザに利用してもらうため、必要ですね。
パスワードをハッシュ化する方法
PHPでは2020年7月現在、password_hashという関数を利用します。この関数はcrypt()と互換性があるので、crypt()で作ったパスワードハッシュも使えますよ。
password_hashは以下のように書きます。
password_hash($password, $algo, $options)
括弧内にはパラメータと呼ばれる引数を入れます。囲みの中は以下の意味があります。括弧内に第二引数まで必ず記述しないといけません。
- $password ハッシュ化したいパスワードの文字列
- $algo アルゴリズムの指定
- $options オプションの指定
例えばどのように使うか、例を出してみますね。
$password = 'testtest';
$himitsu = password_hash($password, PASSWORD_DEFAULT);
$himitsu2 = password_hash($password, PASSWORD_DEFAULT);
$himitsu3 = password_hash($password, PASSWORD_DEFAULT);
$himitsu、$himitsu2、$himitsu3で使っている$passwordは同じですが、ハッシュ化するなら三つとも異なる値になります。
昔はハッシュ化にmd5()やsha1()が利用されていましたが、セキュリティ的に問題がありました。これらの関数は、元データが同じ場合、全て同じハッシュ値に変換します。もしハッシュ値を悪い人に盗まれると、ハッシュ値から元のパスワードを復元できてしまうのです。
しかしpassword_hashは、同じパスワードでも全て異なる値にハッシュ化します。セキュリティ面で以前用いられていた関数より、強固になっていることがわかりますね。
例として用いた文にもう一度注目してください。password_hashの括弧内にPASSWORD_DEFAULTが記述されていますね。
これは、デフォルトでハッシュにしてくれます。password_hashは、他にも以下の3つのアルゴリズムを利用できるので、状況に合わせて活用しましょう。
- PASSWORD_BCRYPT
- PASSWORD_ARGON2I
- PASSWORD_ARGON2ID
暗号化とハッシュ化の違いは?ハッシュ化したパスワードを元に戻せる?
ハッシュ化の方法を学んだところで、暗号化とハッシュ化の違いも理解しておきましょう。どちらも同じことを意味していると言う方もいますが、大きく異なります。
簡単に説明すると、以下のようになりますよ。
- 暗号化したもの → 元の文字列に戻せる
- ハッシュ化したもの → 元に戻せない
暗号化する場合、元の文字列に戻すことを前提に利用します。暗号化する際に元に戻すための鍵が存在します。「他の人に知られたくない情報だけど、この度は中身を見たい」場合、元の文字列へ復元できますよ。
逆にハッシュ化はパスワードなど、元に戻す必要のないものを保管する際に使います。一回ハッシュ化するなら、復元できません。
まとめ
いかがでしたか?
今回はPHPを用いたパスワードのハッシュ化に関することをまとめてみました。何としても、登録し保存したパスワードは、誰にも漏らしたくないですね。その際に利用できる「password_hash」関数を理解できました。
開発したサービスを強固なセキュリティにして、情報の流出や悪用されないようにしましょう!