No226 事業者がパスワードを教えない本当の理由

パスワードを忘れてしまうと面倒ですよね。筆者はもの覚えが悪く、
しょっ中パスワードを忘れ、その都度パスワードの再設定が必要に
なります。

こんな時「今のパスワードを教えてくれりゃいいのに」と思うこと
はないでしょうか?

ですが、その要望に応えてくれる事業者はまずありません。
不正な問合わせを避けるためもあるのですが、パスワードを教える
ことができない事情があるのです。

今回はパスワードを預かっているサービス事業者がどのように
パスワードを守っているか、について解説をします。


1. パスワードを守るのはもはや無理ゲー

ご存知の方もおられるでしょうが、「無理ゲー」という言葉があり
ます。難しすぎてとても一般人ではクリアできそうにないゲームの
ことを指すのですが、それが転じて「事実上不可能」の意味で
使われています。

昨今は犯罪者側の情報の盗み方が高度になっています。
サービス提供側にとって利用者から預かった情報を漏洩させない
ように管理するのが非常に難しく「無理ゲー」といって良い状態
に陥っています。

そのため、サービス提供側も意識が変わっており、「洩れないよう
に最大限の努力はするが、万一洩れても被害につながらない」こと
を重視しています。

パスワードが盗まれても、それがそのまま使えないデータ形式に
しておけば、少しは被害を防げるだろうというわけです。
これはパスワードの使い回しによる被害を抑えるためにも有効です。

ですが、そんな都合の良い方法があるのでしょうか?


2. 暗号化は必ずしも良策ではない

誰しも思いつくのは情報を暗号化して保管しておくことでしょう。

実際、パスワードを暗号化して保管しているサービスはそこそこ
あり、筆者もそのような開発に携わったことがあります。

ですが、ことパスワードについては、暗号化というのはそれほど
優れた方法とは言えません。

暗号化というのは、一般的に暗号鍵というものが必要です。
暗号化する時も、復号(元に戻すこと)する時も同じ暗号鍵を
利用します。(ここでは共通鍵暗号を想定しています)

システム動作にはその暗号鍵が必要ですから、プログラムから
アクセスできる場所に暗号鍵を保管しておかねばなりません。
つまり、サーバ上のどこかに暗号鍵は存在しているわけです。

犯罪者側はパスワードが暗号化されているとわかれば、何とか
して、それの窃取を企てるはずです。鍵を入手してしまえば、
もはや暗号化は何の障害になりません。

結局、パスワードを暗号化する方式では、暗号鍵の存在が全て
の要になってしまいます。
暗号鍵を別サーバに置く、ファイル化しないなど方法がないわけ
ではありませんが、あまり筋の良い方法ではありません。

実はパスワード保管にはもっと良い方法があるのです。


3. ハッシュ関数

ハッシュ関数についてはこのメルマガで何回か解説をしています。
以前からの読者様には「またか」かもしれませんが、軽くおさらい
をしておきたいと思います。

関数というくらいですから、やはり数学に関係があります。

ハッシュ関数というのは内部ではかなり複雑な計算をしているの
ですが、元のデータをルールに従って加工してコンパクトなデータ
を得る計算方法のことを言います。

代表的なハッシュ関数として、MD5やSHA1、SHA2、SHA3といったもの
があります。
以下ではMD5での解説をしていますが、これは既に古い方式で新たな
サービスでは使うべきではないと言われています。(2021年現在)

この計算で得た値のことをハッシュ値と言い、元データからハッ
シュ値を計算することをハッシュ化と言います。

と言葉だけだとよくわからないので、具体的な例でいきましょう。

まず、次のパスワードをハッシュ関数の一つMD5でハッシュ化して
みましょう。

 password
   ↓
 5f4dcc3b5aa765d61d8327deb882cf99

なんだかよくわからない英数字の列が出てきました。
これがハッシュ値です。
え?ますますわからないって?

まあ、もう少しおつきあいください。

他のパスワードでもやってみましょう。

 Password:(先頭だけ大文字)
→dc647eb65e6711e155375218212b3964
 password1:(末尾に1を加えた)
 →7c6a180b36896a0a8c02787eeafb0e4c
 myfavoriteiscollectotherpasswords:(長いパスワード)
 →2226f3f9ce5529d6a4c38a290734f8ba

いかがでしょうか。
元の値がほんの少し変わっただけなのに、ハッシュ値は
全く違った値になっています。
それに、よく見るとどれもハッシュ値の長さはどれも32文字と同じです。

余談:
 ハッシュ値は習慣的に16進数で表示していますので数字っぽく
 ありませんが、やたらとケタ数が多い数字(上の例なら10進数で
 39ケタ程度)に過ぎません。
 16進数について興味のある方は「No221 16進数のナゾ」をご覧ください。
 https://note.com/egao_it/n/n15189d5547b5 

MD5 というハッシュ関数では常に32ケタでしたが、他のハッシュ関数
でも同じ方式を用いる限り、計算結果のケタ数は同じになります。

このように元のデータが違っていると、ハッシュ値もそれぞれ違っ
たものになるのです。元のデータの特徴を示す指紋のようなもの、
と言ってもいいかもしれません。


4. なぜハッシュ関数が暗号化より良いのか?

ハッシュ関数の理屈はわかったにしても、どうしてハッシュ関数が
暗号化より優れていると言えるのでしょうか?

ハッシュ関数というのはあくまで計算ですから、逆算ができるはず
で、ハッシュ値から逆算していけば元の値が得られそうです。

ところが、ハッシュ関数値は数学的には「一方向性関数」などと呼ばれ、
逆算が非常に難しいのです。

一方向性関数などと言われると難しそうですが、なんてことはありません。
掛け算の逆算を思い浮かべてください。
例えば、107×139=14873 という式があります。
107×139は?というのはカンタンに解けますよね。
でも、ナニとナニを掛けたら14873になる?と言われるとどうでしょう?
この計算(逆算)は大変ですよね?
このように逆算がものすごく難しい計算というのは意外にあり、こういう
性質を持つ計算を一方向性関数と呼ぶのです。

計算の結果のハッシュ値がわかっていても、そこから元の値を計算する
ことは事実上できないため、しらみつぶしに元の値を試してみるしか
ないのです。

暗号化の場合は暗号鍵が盗まれれば犯罪者はパスワードを入手でき
ますが、ハッシュ値が盗まれても(すぐには)パスワードが入手でき
ませんから、より安全と言えるわけです。

でも、疑問に思いませんか?
だって、逆算もできないようなハッシュ値しかないのですよ?
そんなので利用者のパスワードの判定なんてできるのでしょうか?


5. パスワードを得られなくても判定はできる

パスワードそのものがわからなくても、ハッシュ値を使ってパスワード
の正否は判断できます。

話は簡単で、利用者が入力したパスワードも全く同じ手順でハッシュ
関数で計算してしまえばいいのです。
もし、パスワードが正しければ、ハッシュ値も合致するはずです。

つまり、こういうことです。

○ユーザ登録する時(パスワード登録する時)
 1. 利用者がパスワードを入力する
 2. パスワードからハッシュ値を計算する。
 3. 計算結果のハッシュ値をデータベースに保管する
   ※生のパスワードは保管せずに捨てられます。

○ユーザがログインする時
 1. 利用者がユーザIDとパスワードを入力する。
 2. 入力したパスワードからハッシュ値を計算する。
 3. データベース上のハッシュ値と計算したハッシュ値が合っていれば
   正しいパスワードである。

こうすれば、生のパスワードを保管しなくても正しいかどうかの
チェックが行えるというわけです。


6. まとめ

2021年現在、サービス事業者として情報漏洩を完全に防ぐことは難しい
と言われています。
その状況下では、仮にパスワードが漏洩してもすぐに被害がないような
対策が大切です。

そのためには、パスワードをそのままではなく加工して保管することが
望まれます。

その方法として、パスワードをハッシュ値に変換して保管しておく方法
があります。
ハッシュ値というのはハッシュ関数という特殊な関数を用いて計算した
値のことで、元の値とは全く無関係(としか思えない)値になります。

一方、実際にパスワードを確認したい時には、入力されたパスワードから
同じ手順でハッシュ値を求め、データベースに保管してあるハッシュ値と
比較をすることで、パスワードが正しいことを検証できます。

コロンブスの卵ですね。

そうそう、今回のタイトル「事業者がパスワードを教えない本当の理由」
の答えを書いていませんでした。

ここまでの解説でお気付きの方も多いと思いますが、事業者側のデータ
ベースには計算結果であるハッシュ値しか保管されていません。
つまり、事業者側のデータベースには生のパスワードがありませんから、
答えようがないのです。

今回は事業者側でのパスワードの保管方法について解説をしました。

次回もお楽しみに。

(本稿は 2021年9月に作成しました)

このNoteは私が主宰するメルマガ「がんばりすぎないセキュリティ」からの転載です。
誰もが気になるセキュリティに関連するトピックを毎週月曜日の早朝に配信しています。
無料ですので、是非ご登録ください。
https://www.mag2.com/m/0001678731.html



この記事が気に入ったらサポートをしてみませんか?