あなたのパスワードはサービス提供者も知らない。diary主にVBAネタを扱っているブログです。2015-08-19あなたのパスワードはサービス提供者も知らない。~認証プロセスを秘伝のタレに例えてみる~アカウント、ID、パスワード、ログイン。これらの言葉は、今では広く認知されている。裏側の仕組みはあまり知られていない。今回は、認証の仕組みを「秘伝のタレ」に例えてIT系以外の方にも分かりやすくその仕組みを解説してみたい。(うまくいくかどうかは分からないが。)まず、何かしらのアカウントを作成すると、パスワードの作成を求められる。このとき、サーバーにパスワードがそのまま保存されていると思っている方も多いと思う。「サービス提供側は私のパスワードを知っているはずだ」と。サービスを提供する側も、普通は顧客のパスワードを知らないのだ。パスワードが保存されたコンピューター自信も、あなたのパスワードを知らない。それならなぜ認証などできるのか。パスワードは、秘伝のタレの材料?うなぎ屋の、秘伝のタレをイメージして欲しい。その他この商品を含むブログを見るパスワードの文字は、その材料である。しょうゆ、みりん、砂糖、酒などを思い浮かべると良い。秘伝のレシピ(材料やその分量)は、タレを開発した本人しか知らない。サーバーに保存されているのは、完成した秘伝のタレである。しておけば、例えサーバー自体が盗み出されたとしても、秘伝のレシピは守られることになる。同じ材料をぶちこみ(パスワード入力)、サーバーに保管されているタレと同じ味が再現できれば、それは秘伝のレシピを知る紛れもない本人であると認定される。これが、基本的な認証の仕組みである。サーバーにはタレしか保管されて無いので、レシピを忘れたから教えてくれというのはお門違い。パスワードリセットとは、「レシピを無くしちゃったから、今度から新開発した別のタレをサーバーに登録してくれ」とお願いすることである。サービス提供側としては、パスワードリセットはできても、パスワードを教えることはできないのだ。具体的な説明さて、認証の仕組みを秘伝のタレに例えて説明したが、コンピューター上では実際にどうなっているのか。パスワードは計算により、ハッシュ化されて保管される。ハッシュというのは、ハッシュドビーフ、ハッシュドポテトなどの、あのハッシュである。その他この商品を含むブログを見るぶつ切り、細切れ、ごたまぜという意味の英単語である。コンピューター上のハッシュとは、具体的には、元に戻せない暗号だと思って欲しい。ハッシュドポテトをジャガイモに戻せというのは無理な話。(料理全般そうだろというツッコミは無しで!)以下、過去記事から引用thom.hateblo.jpたとえばmd5という暗号化方式がある。(現在ではより強固な暗号化方式が存在するが、例示するのにちょうど良いので)「hatena01」というパスワードがあったとすると、md5では次の文字列になる。8583e57a6af9a203aab6dba70f85112e「hatena02」なら次のようになる。90c1d869e54d44712b31cf1b6e0daa42「hatena03」なら次のとおり。c37d0bc46a793a34ae85efca4102b973md5については、どう計算しているのか、詳しくは知らない。RSA暗号という素数を用いた暗号化方式があるので、こちらを例に挙げたいと思う。素数とは、1と自分以外で割り切れない数のことで、1000までの素数はこれだけある。997この中から、適当に5つをピックアップして掛け合わせてみよう。574837097311この574837097311は、分解すると必ず上記5つの素数になる。嘘だと思ったら、以下のサイトで計算してみると良い。keisan.casio.jp数値を素数に分解することを、素因数分解というが、人手でやるのは非常に困難である。コンピューターを使えば、上記の3桁くらいなら余裕で解けてしまうが、実際のところ素数は無限にあるため、ある程度桁が増えてくるとコンピューターでも計算が困難となる。適当に桁を足して計算サイトで実行してみたところ、タイムアウトエラーになった。素数を用いて数を作るのは、ただの掛け算なので簡単であるが、ある程度の桁になるとそれを素数に戻すのはきわめて困難。この性質を用いたのがRSA暗号である。話をmd5方式に戻そう。RSAとかmd5とか、ころころ変わるのは私の知識が不十分な為である。md5でAppleとOrangeをハッシュ化すると、以下のようになる。909cea0c97058cfe2e3ea8d675cb08e1もちろん解析によってハッシュを元の文字列に戻すことは困難であるが、文字列とハッシュの組み合わせを辞書に登録してしまえば、索引によって簡単にハッシュから元の文字列を検索できる。これがレインボーテーブルである。レインボーテーブルとは、いわばタレ職人の知識とカンの蓄積をデータベース化したようなものである。どの材料をどれくらい入れたらどんな味になるかは、長年の経験から分かっているのだ。ありきたりな材料ではすぐにレシピを見抜かれてしまう。英和辞典に載っているような英単語はパスワードにしてはいけないし、桁数が少ないのもまずい。辞書に登録されている可能性が高いからだ。レインボーテーブルは常に更新されて、辞書登録数は増え続けている。このレインボーテーブルに対抗するのがソルト(塩)である。ソルトとは、サーバー側でパスワードに追加する文字列のことである。利用者がAppleという単純なパスワードを作成したとすると、サーバー側ではこれに決まった文字列(たとえばSalt12345)を足してハッシュ化する。2cb4fc93c5cd67b70c91519be759b123認証プロセスでは、ユーザーの入力したAppleに対し、またSalt12345を足してハッシュ化し、保存されているハッシュ値と比較する。Appleなどという単純なワードはさすがにレインボーテーブルに登録されているだろうけど、AppleSalt12345がレインボーテーブルに登録されている可能性は低い。そんなものをいちいち登録していては、テーブルの容量がいくらあっても足りないし、ソルトが変わればまた計算をやり直すハメになる。ソルトは単純にパスワードを長くしてハッシュ値の辞書検索を困難にする目的なので、外部にバレてもさほど影響はない。以上のような仕組みで、皆さんのパスワードは安全に守られているわけである。ないシステムもあるのでやはり単純なパスワードはよろしくない。世の中には恐ろしいことに、いまだに平文でパスワードを保存しているものもあるのだ。(つまりサーバーに侵入された時点でパスワードだだ漏れ)さすがにクレジットカード決済するようなサイトでそれは無いと思うが、よく分からない無名のサービスの利用は自己責任である。03:09あなたのパスワードはサービス提供者も知らない。~認証プロセスを秘伝のタレに例えてみる~Tweet関連記事2016-02-14Webサイト作成技術の移り変わりWebの世界は日進月歩。今回はちょっと風変わりなVBA本を紹介。ビット演算で文字列を暗号化(XOR暗号)前回ビット演算を紹介した。シーザー暗号を作ってみた暗号化とは、何らかの方法でデータを読めなくする方法である。...2015-06-15パスワードの定期変更は危険なのか以下の記事を読んで疑問がわいたので投稿。はてなブログPro弓道と英語が趣味のVBAプログラマーです。大阪でシステム運用の仕事をしています。このブログに掲載しているコードは利用規約の範囲で自由にお使いください。VBAの無料入門教材を配布していますので、VBAを初めてみたい方、ぜひお立ち寄りください。Amazonアソシエイト・プログラムの参加者です。はてなブログをはじめよう!t-homさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。