サーバーでのパスワードの取り扱いについて

これは僕が学部3年のときに習ったことなのだけど、案外知らない人が多い気がしたので、ここに記しておくことにします。

ユーザーがログインするタイプのサービスを作るとき、パスワードを設定することはよくあります。
サーバーでログインの認証を行うためには、ユーザーが入力したパスワードが正しいかどうかを、プログラムの中で判定しなければなりません。
が、このとき単純な文字列比較で認証をしている人はいませんか?

万が一サーバー内の情報が流出した場合を考えると、パスワードをソースファイルの中に直に書いたり、あるいはデータベースの中にそのまま保存したりするのはとても危険です。
また、サーバー管理者が、ユーザーが設定したパスワードを容易に見ることができてしまうというのも、ユーザーとして気持ちいいものではありません。

ではどうするか。


ハッシュ関数というのを使います12
ハッシュ関数というのは暗号化方式の一種ですが、暗号化した値を復号できないという特徴があります。

サーバーには、このハッシュ関数を使って計算した値(ハッシュ値)を保存しておくのです。
そして、ユーザーから送られてきたパスワードを、同じハッシュ関数を使って計算し、求めた値が一致するかどうかで、認証の判断をします。

前述の通り、ハッシュ関数で求めた値は復号することができません。
ということは、万が一パスワードのハッシュ値一覧が流出したとしても、あるいはサーバー管理者がデータベースを覗き見たとしても、その値からパスワードを求めることはできないのです。

以上、サーバー内でのパスワードの取り扱いに関する知識3でした。
これはあくまでサーバー内での話なので、通信路におけるセキュリティを向上させるためには、これとは別にHTTPSなどを使った対策が必要です。

■ 追記

パスワードを忘れた時に、あなたが設定したパスワードはこれですよって教えてくれるサービスって稀ですよね。
だいたいのサービスでは、メールとかで、新しいパスワードを設定したのでこれでログインして、すぐにパスワードを変更して下さいと言われます。

これは、前述の通りパスワードをハッシュ値で保管しているため、サービス提供者もあなたのパスワードを知り得ないないからなんですね。
逆に、あなたが設定していたパスワードはこれですよって教えてくれるサービスの方がセキュリティ上危険です。

すぐに変更して下さいと言われるのは、その新しいパスワードを、サービス提供者は知り得てしまうからというのと、メールというのは盗聴されやすいシステムなので、一度メールに記載されたパスワードはなるべく使わない方がいいからです。

  1. ハッシュ関数には、MD5やSHA-1、SHA-256、SHA-512など様々な種類があります
  2. ハッシュ関数と合わせてソルトというのを使うとベストです。
  3. 学部レベルの知識

コメントを残す