なぜ、パスワードを平文で保存するのですか?(@IT)

「THE ESSENCE」反応率・成約率が劇的にUPした本質のWEBライティングの効果は?厳しいレビュー

ここ最近、すいぶん話題になっている

株式会社Catch the Webの
「THE ESSENCE」反応率・成約率が劇的にUPした本質のWEBライティングが、
とても気になっているんですよね。

出典元:(写真:@IT)

今回の漫画は、サービス提供側のセキュリティについての話です。

 Webサービスの利用者を認証する目的でシステムにパスワードを保存する場合、必ず守らなければならない鉄則があります。

【4コマ漫画】

利用者のパスワードの平文保存はダメ、絶対。
必ずハッシュ化して保存する!

 ということです。

○平文保存したパスワードが漏えいしたら

 ここでいうパスワードの平文保存とは、パスワードを暗号化も何もしない状態でそのまま保存することです。このような保存方式は危険です。なぜならば、万が一漏えい事故の際にパスワードも一緒に漏えいする恐れがあるためです。

 既に報じられている通り、2019年1月に大きなセキュリティ事故が発生しました。

 この事例では、パスワードが平文で保存されていたために、ユーザー情報と一緒にパスワードまで流出する事態となりました。

 この事例では、以下の二次被害が発生する恐れがあります。

1.漏えいしたユーザー名とパスワードを用いて、そのWebサービスに不正ログインされ、さらなる被害を生む

 宅ふぁいる便の事例の場合、不正ログインによりアップロードされたファイルも流出した可能性が考えられます。利用者が一番危惧しているのはこの点ですが、執筆時点では、流出があったのか、公式リリースでは触れられていません。利用者は最悪を想定しなければならない状況です。

2.漏えいしたユーザー名とパスワードを用いて、他のWebサービスに不正ログインされ、さらなる被害を生む

 利用者が複数のWebサービスで同じパスワードを使い回していることは、よくあるケースです。他のWebサービスへの不正ログインにより、情報漏えいだけでなく、金銭的な被害が発生する可能性も否定はできません。

 残念なことに、このような大きなリスクがあるにもかかわらず、パスワードを平文で保存しているWebサービスが多くあります。筆者も、有名なショップのECサイトや、有名企業の採用サイトで、パスワードを平文保存しているケースに遭遇したことがあります(残念ながら、その企業には一次面接でお祈りされました)。

 平成27年に200社弱の企業を対象に行われた総務省の調査では、28社が回答し、そのうち「全体で4割以上のサービスがパスワードのハッシュ化を行っておらず、特に無料のサービスでは7割がハッシュ化を行っていない」ことが明らかになっています。

○平文がだめなら、ハッシュ化すればいいじゃない

 では、サービス提供者はどのようにパスワードを保存すれば良いのでしょうか。

 キーワードは「ハッシュ化」です。以下のようにパスワードからハッシュ値を算出することをハッシュ化といいます。

元のパスワード「32aetwomkjgds」
↓とある方式でハッシュ化
ハッシュ値「57d49e4a62b566fd82f305f1d8ed9e13d5c0c7c479b722108ef71a7ab2a09d36」

元のパスワード「5atewgf」
↓上記と同じ方式でハッシュ化
ハッシュ値「e6a420f5b7ed89d7f404b02411f4e53cf207cf2e6b0c0364b6731d1e5a0c6296」

 以下は、このハッシュ値の性質です。

・同じパスワード、同じ方式であれば、ハッシュ値は同じになる
・異なるパスワードであれば、同じ方式でも、ハッシュ値は異なる
・ハッシュ値から元のパスワードを復元することは非常に困難である

 「同じパスワード、同じ方式であれば、ハッシュ値は同じになる」という性質を利用すれば、パスワードを保存せずとも、パスワードのハッシュ値さえ保存すれば、認証処理には十分です。なぜなら、認証処理のたびに、利用者の入力値から同じ方式でハッシュ値を算出し、そのハッシュ値と、保存しているハッシュ値とを比較すれば良いからです。

○ハッシュドパスワードの処理手順

 例えば、ユーザー登録時の処理を以下の手順で行います。

1. 利用者Aがパスワードとして「32aetwomkjgds」を登録する
2. システムはそのハッシュ値である「57d49e~(略)」を保存する

 ログイン時の認証処理は以下の手順で行います。

1. 利用者Aがログインするとき、パスワード「32aetwomkjgds」を入力する
2. システムは入力された「32aetwomkjgds」から、そのハッシュ値を算出する
3. 上記の結果が「57d49e~(略)」となり、ユーザー登録時に保存されたハッシュ値である「57d49e~(略)」と一致することから、正しいパスワードが入力されたことを判断できる

 もし、パスワードが誤っていれば以下のようになります。

1. 利用者がログインするとき、誤ったパスワード「5atewgf」を入力する
2. システムは入力された「5atewgf」から、そのハッシュ値を算出する
3. 上記の結果が「e6a420~(略)」となり、ユーザー登録時に保存されたハッシュ値である「57d49e~(略)」と異なることから、誤ったパスワードが入力されたと判断できる

 このように、パスワードの平文保存を行わずとも、ハッシュ値の保存のみで認証処理を行えます。

○算出方式が単純だと危険

 パスワードのハッシュ化は、「ハッシュ値から元のパスワードを復元することは非常に困難である」という性質から、万が一ハッシュ値が漏えいしても、直ちに二次被害が発生するリスクを低減できます。

 なお、実際には、ハッシュ値を計算する方式に工夫が必要です。単純な方式でハッシュ値を算出していた場合、パスワードのハッシュ値が漏えいした際に、誰と誰が同じパスワードを使用しているということが簡単に推測できてしまいます。また、脆弱(ぜいじゃく)なパスワードの場合、オフライン総当たり攻撃などですぐにハッシュ値からパスワードを割り出される恐れもあります。

 そのため、(ここでは詳細を割愛しますが)ハッシュ値を計算する際に「ソルト」を付加する手法や、オフライン総当たり攻撃の時間を稼ぐために「ストレッチング」という手法を一般的に用います。

 また、極めてまれに、異なるパスワードでも同じハッシュ値となってしまう「衝突」と呼ばれる事象が発生することがあります。これを意図的に発生させる「衝突攻撃」と呼ばれる攻撃手法も存在します。従って、ハッシュ値の算出方式は、衝突が発生する確率が十分低い方式を用いなければなりません。

○ハッシュ化して保存されていないことを利用者が推測できるケース

 余談ですが、パスワードが平文で保存されているかどうかを利用者が確認できるケースがあります。

 漫画のように「パスワードを忘れた」ときの手続きを行った際に、以前登録した自分のパスワードがメールに記載されていたら、そのサービスではパスワードがハッシュ化されずに保存されています。

 このように脆弱なWebサービスを見つけた場合にすべきことは、SNSにさらす――ではなく、当該サービスの運営企業のセキュリティ関連窓口への連絡するか、情報処理推進機構(IPA)の脆弱性関連情報の届け出制度を活用する、です。

 最後に、繰り返しになりますが、Webサービスを設計するときは、必ず以下の点を守ってください。

利用者のパスワードの平文保存はダメ、絶対。
必ずハッシュ化して保存する!

本当にあんなに効果が出るんなら嬉しいんだけど、
(ちょっと現実離れした)
インチキ商品のような疑惑を感じるのも普通だよね。

わたしが気になっているのはコレ・・・

実践者の暴露レビューとかを参考にして
購入するかどうか決めようと思って

ネットで色々調べたら
そんなに悪い評判や口コミが無いんですよ。

サポートもしっかりしてる★と評判が良さそう

どうしよう・・・これはGO!かな?

コメント