password_hash関数を使ってパスワードを安全に保存しよう【PHP】

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」関数を理解できました。

開発したサービスを強固なセキュリティにして、情報の流出や悪用されないようにしましょう!

MEMO
password_hashについてもっと詳しく知りたい方は、公式マニュアルをご覧ください。 https://www.php.net/manual/ja/function.password-hash.php