crypt
' メカニズムを理解する原作: Garrett Wollman
<wollman@FreeBSD.ORG>
25 September 1995.
訳: 日野 浩志
<hino@ccm.cl.nec.co.jp>
.
24 September 1996.
S/KEY は一方向ハッシュ関数 (ここで述べているバージョンでは, 過去と の互換性を保つために MD4 を用いています. S/KEY の他のバージョンでは MD5 や DES-MAC を用いているものもあります) を基にしたワンタイムパスワー ド方式です. S/KEY は, バージョン 1.1.5 以降のすべての FreeBSD に標準的 に含まれています. S/KEY は FreeBSD 以外の数多くのシステムの上でも利用 可能であり, その実装の数も増えています. S/KEY ば Bell Communications Research, Inc. の登録商標です.
以下の説明では, 三種類の異なる「パスワード」が使われます. まず一つ
目は, あなたが普段使っている普通の UNIX スタイルの, もしくは Kerberos
でのパスワードです. ここではこれを ``UNIX パスワード'' と呼ぶことにし
ます. 二つ目は, S/KEY の `key
' プログラムによって生成され,
`keyinit
' プログラムとログインプロンプトが受け付ける, 一回限りの
パスワードです. ここではこれを ``ワンタイムパスワード'' と呼ぶことにし
ます. 三つ目のパスワードは, `key
' (と場合により `keyinit
')
プログラムに対してユーザが入力する秘密のパスワードで, ワンタイムパスワー
ドを生成するのに使われます. ここではこれを ``秘密のパスフレーズ'' もし
くは単に ``パスフレーズ'' と呼ぶことにします. (訳注: ユーザが頭の中だ
けにしまっておくべきものが, この秘密のパスフレーズです. なお, 原文では
これをパスワードと表記していますが, 混乱を避けるために訳文ではすべて ``
秘密のパスフレーズ'' に統一しています.)
秘密のパスフレーズは, UNIX パスワードと同じである必要はありませんし,
また UNIX パスワードと何らかの関連性を持たなければならないということも
ありません (両者を同一に設定することは可能ですが, お奨めしません).
UNIX パスワードは長さが 8 文字に制限されています (訳注: FreeBSD で DES
を導入していない場合はもっと長いパスワードも認識されます). これに対し,
S/KEY では秘密のパスフレーズを好きなだけ長くすることができます (訳注:
実装上, `key
' コマンドなどのバッファ長で制限されてしまう可能性が
あります. 200文字程度に押えておいた方がよいでしょう :-). 筆者は 7 語か
らなる文を使っています. 通常の設定では, S/KEY システムは UNIX のパスワー
ドシステムと完全に独立して動作するようになっています.
S/KEY システムでは他に二種類のデータを使用します. 一つは ``シード
(種)'' または (混乱を招きますが) ``キー'' と呼ばれるもので, (訳注: デ
フォルトでは) 二つの文字と五つの数字で構成されます. もう一つは ``シー
ケンス番号'' で, 1 以上の整数です. シーケンス番号は特に指定しなければ
100以下です (訳注: ``keyinit
' プログラムでは 9999 まで指定できま
す). S/KEY はここまでに述べたデータを利用してワンタイムパスワードを生
成します. その方法は, まずシードと秘密のパスフレーズを連結し, それに対
してシーケンス番号の回数だけ一方向ハッシュ (RSA Data Security, Inc. に
よる MD4 セキュアハッシュ関数) を繰り返し計算します. そしてその結果を
六つの英単語に変換します (訳注: ハッシュ計算の後, 64ビットに収まるよう
にデータを処理したものが厳密な意味でのワンタイムパスワードです. 通常は
ユーザの便宜のために, この 64ビットデータと六つの英単語との間で変換処
理をおこなっています) . `login
' プログラムと `su
' プログラム
は, 前回最後に受け付けられたワンタイムパスワードを記録しています. そし
て, その前回のワンタイムパスワードと, ユーザが入力したワンタイムパスワー
ドを一回ハッシュ関数にかけた結果とが一致した場合に, このユーザは認証さ
れます. 一方向ハッシュ関数を使うことにより, もし (ログイン等に成功した)
ワンタイムパスワードが一回盗聴されたとしても, 次回以降に使われる複数の
ワンタイムパスワードを生成することは不可能です. シーケンス番号はログイ
ン (等) が成功するたびに一つずつ減らされて, ユーザとログインプログラム
の間で同期が取られます. (シーケンス番号が 1 になったら, S/KEY を再度初
期化する必要があります.)
次に, S/KEY 関連の四つのプログラムについて説明します. `key
' プ
ログラムは, シーケンス番号と, シードと, 秘密のパスフレーズを受け付けて,
ワンタイムパスワードを生成します. `keyinit
' プログラムは, S/KEY
を初期化するのに使用され, また秘密のパスフレーズやシーケンス番号やシー
ドを変更するためにも使用されます. このプログラムを実行するには, 秘密の
パスフレーズか, または, シーケンス番号とシードとワンタイムパスワードの
一組かの, どちらかが必要になります. `keyinfo
' プログラムは,
/etc/skeykeys
というファイルを調べて, このプログラムを起動し
たユーザの現在のシーケンス番号とシードを表示します. 最後に,
`login
' と `su
' プログラムについてですが, これらは S/KEY の
ワンタイムパスワードを, (訳注:システムが) ユーザを認証するものとして受
理する処理をおこないます. `login
' プログラムは, 指定された特定の
アドレスからの接続に対して, UNIX パスワードの使用を認めなくする機能,
逆に言えば S/KEY の利用を強制する機能も持っています.
このドキュメントでは, 四種類の異なる操作について説明します. 一つ目
は, `keyinit
' プログラムを信頼できる通信路上で利用する場合で, 一
番始めに S/KEY を設定する操作や, 使い始めたあとで秘密のパスフレーズや
シードを変更する操作です. 二つ目は, `keyinit
' プログラムを信頼で
きない通信路上で利用する場合で, 操作の目的は一つ目と同じです. この場合
には `key
' プログラムを併用する必要があります. 三つ目は,
`key
' プログラムを使い, 信頼できない通信路を通じてログインする操
作です. 四番目は, `key
' プログラムを使って, 複数のワンタイムパス
ワードを一気に生成する操作です. ここで生成した複数のワンタイムパスワー
ドは, メモしたり印刷したりして携帯し, 信頼できる通信路が一切ないところ
(例えば展示会場など) で利用することができます. (訳注: ワンタイムパスワー
ドを記録した紙をなくさないこと! 電話番号やIPアドレス, ユーザ名を一緒に
メモしていたら最悪です!!)
crypt
' メカニズムを理解する