ガラパゴスタ

楽する。楽しむ。生み出す。

宅ふぁいる便漏洩事件の「平文でパスワード保存」がなぜヤバイかをわかりやすく説明する

f:id:stakiran:20190129202800j:plain

オージス総研のファイル共有サービス「宅ふぁいる便」で 480 万件もの個人情報が漏洩する大ニュースが起きていますが、その中でも特にヤバイのが 「パスワードが平文で保存されている(暗号化して保存していない)」 ことです。

これの一体何がヤバイかについて、エンジニアでない方にもわかるように説明を試みたいと思います。

はじめに

元ネタについて

元ネタは以下をどうぞ。

本記事の読者について

ID、パスワードについては既に知っていることを想定します。

本記事の内容について

  • わかりやすさを優先するため、説明は「ざっくりした解説」に留めています(たとえばハッシュの衝突については説明してません)

パスワードをそのまま保存するのはヤバイ

パスワードをそのまま保存することを平文(ひらぶん)で保存する、などと言います。A さんのユーザー名 userA、パスワードが iamA_0401 だとしたら、

userA,iamA_0401

みたいな感じでこのまま保存します。

これは当然ながらサービス利用者からは見えませんが、サービス運営側から見えるので大問題です。もし皆さんが使っているサービスについて、「実はサービス運営側はいつでも中身を見れるよ」となっていたとしたら、どう思います?論外ですよね。

加えて、今回のように平文のパスワードが流出・漏洩してしまうと、漏洩先の誰かも同様、中身を見ることができます。

でもパスワードは保存しないとログイン機能は提供できないよね?

たしかにそうです。ID/パスワードを利用して個人を識別する機能がある以上、サービス運用側は必ず利用者のパスワードを保存しなければなりません。会員登録時に保存したパスワードを元に、後からログインしてきた誰かの ID とパスワードをチェックして、「あ、これは既に保存されてるこの人と一致するね。オッケー、ログインしていいよ」と許可するわけです。保存は絶対に必要です。

でも平文で保存すると危ないんでしょ?

どうするか。

結論を言うと 暗号化して保存します

ただし、暗号化という言葉だと語弊があって、より正確には ハッシュ化して保存する と言います。

ハッシュ化って何?

たとえば A さんのユーザー名 userA、パスワードが iamA_0401 だとして、このパスワードをハッシュ化して保存するとしましょう。たとえば以下のようになります。

userA,bebf682496459c45d0cecdb35995aa1b

おっと、bebf682496459c45d0cecdb35995aa1b とかいう、よくわからない文字列が出てきましたね。

これがハッシュ化されたデータです。

ハッシュ化というのは、簡単に言えば あるデータから、n 文字(この例では 32 文字)の文字列をつくる 処理です。内部的には数学やら情報工学やらなんやら高度なことをしてます。これを使えば、たとえば辞書一冊分のデータも 32 文字になったりします。

このハッシュ化のすごいところは 逆方向の変換ができない ところにあります。上記の例でいうと、bebf682496459c45d0cecdb35995aa1b というハッシュ化データから、元の iamA_0401 というパスワードにはたどり着けません。そうなるように、ハッシュ化の処理はつくられています。

イメージ湧きづらいですが、辞書一冊分のデータが、たった 32 文字になることを考えてみると、わかりやすいかと思います。たった 32 文字のヒントから、辞書一冊分のデータを取り戻すなんて、どう考えても無理ですよね。

で、そのハッシュ化でパスワードを保存すると、何が嬉しいの?

パスワードをハッシュ化したデータであれば、誰かに見られてもパスワードはバレませんし、流出してもバレません

何度も言うように、userA,bebf682496459c45d0cecdb35995aa1b というデータが流出したところで、

「あ、userA さんというアカウントは存在しているんだな」

ということくらいしかわかりませんし、bebf682496459c45d0cecdb35995aa1b というハッシュ化されたデータから、元のパスワード iamA_0401 を知ることも不可能です。

そういうわけで、パスワードはハッシュ化して保存するのが当たり前 なんですね。

IT を知らない素人が知らないのは問題ありませんが、サービス運営側が知らない、保存してないというのは相当ヤバイです。あえてたとえるなら銀行が「施錠していない、ただのロッカーで金を保管している」ようなものです。

冒頭のリンク「ご質問一覧」では、Q15 にて

Q15. パスワードは暗号化されていなかったのか?

  1. 流出したログインパスワードは、暗号化されておりませんでした。

とありますが、これはたとえるなら「金庫は施錠されていなかったのか」「はい、してませんでした」と言っているようなものです。

ちょっと待って、パスワードをハッシュ化して保存したら、ログイン認証ってできなくない?

ここで鋭い方はこう思うかもしれません。

「パスワードをハッシュ化して保存した場合、ログイン認証はどうやって行うの?」と。

たとえば A さんがユーザー名 userA、パスワード iamA_0401 と入力してログインしようとすると、サービス側は

userA,bebf682496459c45d0cecdb35995aa1b

というデータと照合するわけですが、何度も言うように bebf682496459c45d0cecdb35995aa1b を元に戻すことはできません。これじゃ照合できないのではないか。

……できます。

鋭い方は既にお気づきかもしれませんが、A さんが入力してきた方のパスワードをハッシュ化する のです。そして、その結果が bebf682496459c45d0cecdb35995aa1b であれば、パスワードは同じだと判断できます。

つまり、私達がパスワードを入力してログインしようとする時、裏ではハッシュ化が行われて、そのハッシュ化されたデータを、「既にサービス側に保存されている」「あなたの」「パスワードをハッシュ化したデータ」と比べるわけです。

ここまでのまとめ

ここまでをまとめます。

  • パスワードを平文で(何の加工もなしにそのまま)保存するのはヤバイ、見られたら一発アウト
  • じゃあどうするか? → パスワードはハッシュ化してから保存する
  • ハッシュ化したデータからは元のデータは取り出せないので、漏洩しても元のデータ(パスワード)はバレない
  • サービス側が認証する時は、ユーザーが入力してきたパスワードを都度ハッシュ化して、既に保存してある「パスワードをハッシュ化したデータ」と比較することで認証する
  • これは当たり前の常識です

ユーザー名とパスワードが漏洩したらなんでヤバイの?

もう一つ、取り上げておきましょう。

「ユーザー名とパスワードが漏洩したらなんでヤバイの?宅ふぁいる便を不正利用されるだけでしょ?」

「その宅ふぁいる便は今、サービス停止しているし、問題ないのでは?」

と考えている方がいらっしゃるかもしれません。

残念ですが、認識が甘すぎます。

もし(宅ふぁいる便で漏洩してしまった)あなたが他のサービスを使っていて、そこでも「宅ふぁいる便と同じパスワード」を使っていたとしたら?

今回の漏洩では氏名など他の個人情報も漏れているので、あなたが他のどのサービスを使っているかは簡単に探せます。そして、あなたが使っている各サービスについて、宅ふぁいる便と同じパスワードで不正アクセスします。ログインできちゃいました!……なんてことにならない自信、ありますか?

人は面倒くさがりな生き物で、パスワード管理も結構いいかげんなものです

同じパスワードを結構使いまわしていたりします。

最近では二段階認証なんて言葉も出てきましたが、これもこのような危なさがあるために生まれたセキュリティです。

※ちなみに二段階認証とは、パスワードの他に電話番号なども必要にするという認証方法で、あなたが普段使わない端末からログインしようとすると たとえパスワードが合っていても 「おいちょっと待てや、まだ信用できへんで、電話番号に追加パスワード送るからそれも入力しろや。本人ならできるやろ?」と確認させる仕組みです。

というわけで、ヤバイです。

  • あなたが宅ふぁいる便によって漏洩してしまった人で、
  • 宅ふぁいる便で使っていたパスワードと同じパスワードを、
  • 他のサービスで使っていた場合、

漏洩情報を使う悪者は、あなたの他サービスにログインできちゃいます。危ないです。そういうわけで 宅ふぁいる便と同じパスワードを使っているサービスについては、全部違うパスワードに変えろ という警告が出ているのですね。

(余談) プライバシーマークとは

パスワードはハッシュ化して保存するという常識。平文で保存することの危険性……にもかかわらず、オージス総研はプライバシーマークを取得しています。それってどうよ?的なコメントがはてなブックマークにありますね。

これについて、少し調べてみました。

まずオージス総研がプライバシーマークを取得しているかどうかですが、以下サイトで調べるとヒットします。取得しています。

次にプライバシーマークについて見てみましょう。

上記公式サイトによれば、

日本工業規格「JIS Q 15001 個人情報保護マネジメントシステム-要求事項」に基づいた基準に適合した事業者のみ使用が認められます。

とあります。この基準適合をもって

「個人情報」を大切に取り扱う事業者

としているわけです。

では、その要求事項とやらは「パスワードを平文で保存するべきではない」的な事項を扱っているのでしょうか。要求事項は以下 PDF ファイルです。

見た感じ、技術的なことは何も書いてないようですね。

結論として、プライバシーマークは「技術的に適切に」個人情報を管理運用していることまでは証明しない と言えそうですね。

おわりに

パスワードをハッシュ化して保存せず平文で保存していることのヤバさについて、わかりやすい説明を試みてみました。上手く伝わりましたら幸いです。