パスワード小史

IIJ技術研究所
山本和彦

これは、山本和彦が BSD Magazine に掲載した原稿です。 BSD Magazine 編集部の許可を得てここに転載します。 図はありません。図が欲しい方は、BSD Magazine を買って下さい。:-)
マルチユーザ OS である UNIX では、ユー ザを認証し、適切な権限を委譲する必要 がある。認証の枠組みとして、長年パス ワードが利用されてきた。この記事では、 パスワードの歴史を紐解いてみる。

古のパスワード

UNIX が開発された当初からパスワード が認証の仕組みとして採用されていた。 しかし、現在と違ってパスワードは生の ままファイルに保存されていた。

どの文献で読んだか忘れてしまったが、 この方法が危険であることを立証する事 件が実際に起こったらしい。ある端末の バグのせいで、ルートが表示しているパ スワードファイルの内容が、一般ユーザ の端末へ表示されてしまったのだ。

これは極端な例だが、ルートの端末を一 般ユーザが覗き込む場面などいくらでも ある。パスワードの常識として、生パス ワードをファイルに直接保存してはいけ ない。


DES パスワード

長い間使われている DES パスワードは、 8 個の ASCII 文字である。俗に「パス ワードは暗号化されて保存されいる」と いわれる。

正しく表現すれば、パスワードはセキュ ア・ハッシュ関数(以下単にハッシュと 呼ぶ)でハッシュされてファイルに保存 されている。このハッシュ関数にたまた ま DES という暗号を用いたので、「暗 号化されている」という言い回しが広まっ た。

セキュリティ技術の知識が今のように一 般的でなかった時代では、そう表現した 方がユーザが安心したという側面もあっ たのだろう。

パスワードは、crypt() という関数を使っ てハッシュされる。図 1 に crypt() で 利用されているハッシュ関数の概念図を 示す。

ハッシュ関数 crypt() は入力として、

を取る。

出力は、

を 13 個の ASCII 文字で表現した文字 列である。(最初の 2 文字が乱数を表わ す。)

ハッシュ関数の中身は 25 段の DES と なっている。

認証の手続は、次のようになる。すなわ ち、64 ビットの 0、ユーザが入力した パスワード、乱数(ハッシュされたパス ワードの先頭 2 文字)にハッシュ関数を 適応し、出力を得る。この出力と、ファ イルに保存されているハッシュされたパ スワードを比較する。一致すれば、パス ワードが合っているとになるから、認証 が成功する。

ハッシュされたパスワードを比較するの であって、パスワードを比べるのではな いことに注意しよう。このような仕組み のおかげで、あるユーザのパスワードは、 ルートの権限をもってさえ知り得ないよ うになっている。

このパスワードの最大の欠点は、パスワー ドに ASCII 文字を 8 個しか利用できな いことだ。後述するが、コンピュータの 性能が向上した現在、これはあまりに短 い。

そこで最近はハッシュ関数として MD 5 を用い、入力の文字列の制限を取り除い ている場合もある。この種のパスワード では、好きなだけ長いパスワードを利用 できる。


パスワードへの攻撃

次にパスワードへの攻撃方法を紹介しよ う。

パスワードを盗み取る最も簡単な方法は、 パスワードを入力しているユーザの後ろ に立って、肩越しに覗き込むことだ。こ れを、"over shoulder crack" と呼ぶこ とがある。(だから、パスワードにはす ばやく入力できる文字列を選べともいわ れる。)

また、ユーザに近寄らなくても、パスワー ドを推測できる方法がある。ユーザは概 して怠け者なので、ユーザ名をパスワー ドとして利用していることが多い。「そ んなバカな」と思われるかもしれないが、 本当の話だ。

ユーザ名と同じパスワードのことを、戒 めをこめて Joe account と呼ぶことが ある。あるユーザが Joe account を使っ ているか知るのは造作もないことだ。そ のユーザの名を語って、ログインを試み ればよい。もちろん、パスワードには同 じユーザ名を入力する。


辞書攻撃と総当たり攻撃

もし、ハッシュされたパスワードを入手 できるなら、もっと洗練された方法を使っ て、元のパスワードを推測できる。いわ ゆる、「辞書攻撃」と「総当たり攻撃」 である。

「辞書攻撃」とは、ユーザが利用しそう な単語をあらかじめ用意しておく。それ らをハッシュにかけて、入手しておいた ハッシュされたパスワードと比較する。 一致すれば、その単語がユーザの利用し ているパスワードだ。

「総当たり攻撃」とは、パスワードのす べての可能性を試す方法である。

辞書攻撃は、コンピュータがまだ非力な ころ考案された手法である。つまり、コ ンピュータの能力がパスワードの全空間 を探索できるほど速くなかったので、空 間の一部を効率よく検索できるよう工夫 したのである。

しかし、現在ではコンピュータは高速で ある。DES パスワードの空間は 56 ビッ トしかなく、小さ過ぎる。正確なことは 知らないが、現在では数台のコンピュー タでも数時間から数日で全空間を網羅で きると思う。

DES パスワードの乱数(salt) は、辞書 攻撃をしにくくするために考案された。 つまり、あるパスワードを 4096 通り (12ビット)にハッシュ可能にし、あらか じめハッシュされた単語の辞書を用意で きなくしていたのである。

また、DES を 25 回用いるのは、ハッシュ 値をすばやく計算されないためである。 しかし、今となっては、これらの対策は、 滑稽にさえ映る。パスワードを強くする ためには、パスワードの空間を広げるの が本質的な解決策だからだ。

最近の UNIX では、MD 5 をハッシュ関 数として用いて、パスワードの空間を無 限にしている。

任意の長さを許すパスワードの仕組みを 用意しても、システムの中で一番弱いの は、ユーザ自身であることを忘れてはな らない。多くのユーザは 8 文字以下の パスワードを利用したがる。覚えるのも 入力するのも面倒だからだ。

磐石のパスワード機構を用意しても、依 然として辞書攻撃が有効なのは皮肉的な 話だ。


シャドウ・パスワード

以前はハッシュされた DES パスワード が、/etc/passwd に保存されており、だ れでも見ることができた。「暗号化され ているから安心だ」と勘違いしていたの だ。

「辞書攻撃」や「総当たり攻撃」への理 解が深まると、ハッシュされたパスワー ドを知られることも危険だと認識される ようになった。このため現在では、ハッ シュされたパスワードは、ルートだけが読み出し 可能なシャドウ・パスワード・ ファイルに格納されている。

MD5 パスワードは空間が広いので、ハッ シュされたパスワードを公開しても理論 上は問題ない。しかし、ユーザは安易な パスワードを使う傾向にあるから、実際 に利用している空間はいたって小さい。 そこで実践的には、敵に情報を与えない よう、ハッシュされた MD 5 パスワード も隠蔽する方が安全といえる。


パスワードの盗聴

UNIX にネットワークの機能が備わり、 ネットワーク経由でログインできるよう になると、新たな問題が発生した。ネッ トワーク上に生パスワードが流れるので、 簡単に盗聴されてしまう。

rlogin といた r コマンドでは、あるコ ンピュータからログインする場合は、パ スワードの入力を省略するよう設定でき る。これは突き詰めると、パスワードの 代りに、IP アドレスを認証の仕組みと して使っていることになる。

r コマンドでは所定の設定をすると、生 パスワードがネットワークに流れないの で、盗聴の心配はない。しかし、IP ア ドレスを認証の仕組みとして利用するの はお勧めではない。IP アドレスを偽る のは簡単だからだ。事実、有名なクラッ カー Mitnick はこの方法で rlogin の 認証の弱点をついた。

このようなことから、パスワードを流さ ない方法よりも、盗聴されても問題ない パスワードを使って認証する方法が一般 的となった。


使い捨てパスワード

「使い捨てパスワード」とは、その名の 通り 1 回使うと捨ててしまうパスワー ドのことだ。ログインする度に異なるパ スワードを入力する。

この仕組みは簡単に実現できる。説明の ため、ユーザが端末として利用するロー カルのコンピュータをクライアント、こ れからログインするリモートのコンピュー タをサーバと呼ぼう。クライアントとサー バ間ではあらかじめ秘密(共有鍵暗号の 鍵)を共有しておく(図2)。

使い捨てパスワードは以下のようにやり とりされる。

乱数は毎回生成され、再利用されないの で、盗聴されても問題はない(実際には この方法をもう少し改良し、生の乱数が ネットワークに流れないようにする)。 ただし、クライアント側には、復号化と いう作業が必要となる。

復号化のためのコマンドをインストール したラップトップを持ち運べればよいが、 使い捨てパスワードが考え出された当時 は、これは一般的ではなかった。

そこで、使い捨てパスワードでは、いく つかのパスワードをあらかじめ計算して おける方法を採用している。

また、上記の方法では秘密を生で保存し なければならないという問題もある。使 い捨てパスワードでは、この問題も解決 している。

使い捨てパスワードの仕組みはややこし い。そこで、説明を具体的にするために、 表1を用いることにする。

表1:
ログイン番号計算使い捨てパスワード
初期 4 f(f(f(f(x))))VASE GANG GEE FOUR ONES JOEY
1回目 3 f(f(f(x)))MASH YOGA SEEK DRUG FOIL LEAR
2回目 2 f(f(x))GALE TOAD BRAN MOOT RUST WAG
3回目 1 f(x)BERN WANG MA VOID FED JOEL

表1は、あらかじめ 3 つ(初期値を含め ると 4 つ)の使い捨てパスワードを発行 した例を示している。x がパスワード、 f() はハッシュ関数を表わす。使い捨て パスワードでは、ハッシュ関数に MD 4 や MD5、SHA-1 を利用する。

初期段階では、f(f(f(f(x)))) という使 い捨てパスワードがサーバに保存される。 (文字列表記は表1を参照のこと)

クライアントが 1 回目のログインを試 みると、サーバは 3 という番号を返す。 これに対しクライアントは、パスワード に f() を 3 回適応した使い捨てパスワー ド f(f(f(x))) を返す。

この使い捨てパスワードは、専用のコマ ンドがあるならその場で計算してもよい し、あらかじめ紙に出力しておいたもの を入力してもよい。

サーバは、クライアントから渡された使 い捨てパスワード f(f(f(x))) に f() を一回施したものと、もともとファイル に保存してあった使い捨てパスワード f(f(f(f(x)))) とを比較する。一致すれ ば、ログインを許可し、f(f(f(x))) を ファイルに保存する。

このように、ログインが成功するごとに、 状態が 1 つ進む。使い捨てパスワード を使いきった際には、再び初期化する必 要がある。

ネットワーク上を流れる使い捨てパスワー ドから、次の使い捨てパスワードを推測 することは困難である。たとえば、1 回 目の f(f(f(x))) から 2 回目の f(f(x)) を推測することを考えてみよう。

これは、ハッシュ値(出力)から入力を求 めることに等しい。ハッシュ関数は一方 向性を有しているので、この作業は困難 である。(もちろん、よいパスワードを 選択していることが前提条件だ。)

まとめよう。使い捨てパスワードでは、 あらかじめ系列を決めて、いくつかの使 い捨てパスワードを発行する。この作業 は、次々とハッシュ値を計算するだけだ から容易である。あらかじめ全部を計算 して紙に出力しておいてもよいし、ログ インの際に計算してもよい。

サーバでの認証作業は、ある使い捨てパ スワードのハッシュ値を計算するだけで ある。この作業も簡単だ。逆にクラッカー が、ある使い捨てパスワードから次の使 い捨てパスワードを推測するためには、 ハッシュ関数の逆関数を求める必要があ り、困難である。(もちろん、よいパス ワードを使っていることが前提だ。)


パスワードの暗号化

使い捨てパスワードでは、毎回紙に印刷 れた使い捨てパスワードを入力したり、 その場で使い捨てパスワードを計算した りする必要があって、面倒だ。これを解 消するために、パスワードを横取りし、 計算した使い捨てパスワードに置き換え てくれるフロントエンドも作成された。

しかし、そんなフロントエンドも、SSH の登場で一掃された感がある。パスワー ドを暗号化して送れば盗聴されても安心 だ。しかも、通信全体が暗号化されてい るので、パスワードしか保護できない使 い捨てパスワードとの優劣も明らかだ。

ラップトップを持ち運ぶことが一般的に なってきた現在、専用の SSH クライア ントをあらかじめインストールしておく という前提も成り立つ。

簡略化して SSH の仕組みを説明する。 クライアントは、ユーザが入力したパス ワードを、サーバの公開鍵で暗号化して サーバに送る。サーバは、これをサーバ の秘密鍵で復号化し、パスワードを取り 出す。このパスワードを用いて、パスワー ド認証を試みる。

SSH の最大の弱点は、サーバの秘密鍵が 生で保存されていることだ。もちろん、 ルートしか読めないファイルに格納され てはいるが。

この問題を解決するために、秘密鍵を暗 号化してファイルに保存しておき、起動 時にルートに復号鍵(パスワード)の入力 を促す仕組みをもつサーバもある。しか し、このサーバを起動する際は必ずコン ソールまで行く必要があるので、一般に は普及していない。


おわりに

駆け足で UNIX のパスワードの歴史を振 り返ってみてきた。以前のパスワードの 仕組みは脆弱であったが、現在では強固 となっている。むしろ、一番弱いのはユー ザの怠け心だ。日頃から(10 文字以上の) 十分に長いパスワードを用いる習慣をつ ける必要がある。
Email: kazu@mew.org
URL: http://www.mew.org/~kazu/