トップページに戻る
tokix.netはネットワーク・セキュリティ周辺から半径rな雑文を垂れ流す不定期更新個人サイト>>このサイトについて

会員制サイトとパスワード

<<トップカテゴリー「NetChildren」に戻る

会員制サイトにおけるパスワード(1) (>>この記事のみを表示)

例えばブラウザメール、例えば会員制出会い系サイト。こうした「IDを作成しパスワードを使ってログインするサイト」。その「パスワード」について、です。
人間である以上「パスワード」をなくすことってある訳です。ID制のサイトには「パスワードを忘れた人の救済措置」みたいなものがあったりします。「秘密の質問」であったり「あらかじめ登録しておいたアドレスにパスワードをメール送信」であったり。
この「救済措置」を観察することで、「そのサイトでパスワードがどのように扱われているか」を推測してみましょう。

「救済措置」には次のような分類方法があることにお気づきでしょうか?
□1:正しいパスワードを表示
例えば秘密の質問に答えるとブラウザ上に表示される。あらかじめ登録しておいたメールアドレスにパスワードが送りつけられる。何にしても「正しいパスワード」が表示されますよね。
□2:パスワードを変更できる
秘密の質問に答えるとパスワードを変更することができる。そうすれば変更後のパスワードでログインできる。
例えばhotmailはこっちです。

□1と□2の差なんです。はっきり言って「秘密の質問に答えるとパスワードが表示される」のと「登録しておいたメールアドレスにパスワードが送ってくる」に(今回と次回で扱うテーマにおいて)大差はありません。ブラウザに表示するかメールを使うかの差に過ぎません。しかし□1と□2には大きな差があります。

さて、perlにはcryptという関数があります。
(基本的にこの文章はperl知らない人を対象にしてますのでご安心を。)
$crypted = crypt ( $content, "ab" );
$contentという文字変数に「ab」という「キー(※1)」を使った暗号化を施して$cryptedに代入してます。
※1
「関数」というのは例えば「f(x)=3x+5」とかそういうヤツですね。「キー」と言われるとよく分からないかもしれないのでとっても簡単かつ乱暴に説明しておきます。
f(x,a)=3x+a
xが「変数」でaが「キー」。「f(x)=3x+5」で出てきた数が例えば20ならばxは5ですよね。でも「f(x,a)=3x+a」で出てきた数が20だとしてもaが分からなければxは分かりません。(x,a)=(5,5)なのか(x,a)=(6,2)なのか(x,a)=(7,-1)なのか・・・。
crypt暗号化は基本的に一方向です。
例えば「tokix」という文字列をあるキーを使ってcryptにかけた結果「asgefhk」になったとしましょう。この「asgefhk」を元に「tokix」を復元することは基本的に不可能なんです。このように「復元が基本的に不可能」であることを「一方向」って言います(※2)。
※2
例えば「g(x)=x^3」(a^bは「aのb乗」)。xに1.72を代入すると5.088448になります。縦書き計算するか電卓を使うかすれば小学生でも出せますね。しかし「3乗すると5.088448になる数は?」と聞かれたら高校生でも「・・・」ですね。こういう性質を「一方向」と言います。と、かなり乱暴に説明しておきます。

5.088448は末桁が8です。よってxの末桁は2です。また、5.088448は小数点以下が6桁ですからxは小数点以下が2桁です。そして概算からxは1以上2以下です。
だから1.12や1.22を3乗していけばいつか「3乗して5.088448になる数(=1.72)」は分かる。
この方法でg(x)からxを求めることは「復元」ではないですよ。
・・・まぁ本筋とは関係ないんで意味分からなければ深く気にせずに。
「そんなの何に使うの?」と不思議かもしれません。普通「暗号」っていったら「秘密のメールを他人に読まれないために暗号化しておいて相手だけが解読できる」とかそんな感じですよね。「一方向」ってのは「解読不可能」ってことですから。そうした用途には適しません。

crypt関数はパスワード認証によく使われます。正しいパスワードをあらかじめあるキーで暗号化しておくんです。で入力されたパスワードも同じキーで暗号化します。暗号化されたモノ同士を比較して「入力されたパスワードが正しいか」を判断する訳です。

会員制サイトにおけるパスワード(2) (>>この記事のみを表示)

会員制サイトにおけるパスワード(1)で書いた分類方法□2のシステムはサーバー内に「正しいパスワード」を保存する必要がありません。一方向暗号を施した文字列があればそれで事足ります。秘密の質問に答えた時点でその(暗号化された)文字列を新しく書き換えればいいんです。
□2の中で「秘密の質問に答えるとパスワードを変更できる」というhotmail式を追跡してみましょう。
  1. 正しいパスワードに「tokix」、秘密の質問の答えに「マンゴ」を設定
  2. 「tokix」を一方向暗号化した文字列aと「マンゴ」を一方向暗号化した文字列Aをサーバーに保存
  3. パスワードを忘れた!
  4. 秘密の質問に対して「マンゴ」を入力
  5. 入力された「マンゴ」を一方向暗号化し文字列A'を得る
  6. 得られたA'がサーバーに保存されているAと同一なので「正しい答え」と判断・新しいパスワードが設定可能になる
  7. 新しいパスワードに「kawase」を設定
  8. サーバーから(最初のパスワード「tokix」を一方向暗号化した)aを消去・代わりに新しいパスワード「kawase」を一方向暗号化した文字列bを保存
生のパスワードをサーバーに保存する必要がないのが分かりますね?

対して分類方法□1のシステムはサーバー内に「正しいパスワード」ないしは「正しいパスワードを可逆的に暗号化した文字列」を保存する必要があります。「(ブラウザかメールに)正しいパスワードを出力する」っていうのはそういうことです。

仮にサーバー内のパスワードデータファイルを抜けたとします。cgiのバグ等を利用し抜けたとします。
□2では抜けたとしてもそれは意味のない文字列です。□1では意味のある文字列です。

こうした視点で見ると□2の方が□1より強固なシステムと思えます。勿論これが唯一の視点ってことではないですけど。「秘密の質問」に「適当に答えればいつか当たる」ようなモノを設定されたら脆いですし。
「パスワードを忘れた場合の救済措置」といった極一部分を見ることでサーバー上で動いているcgi等内部システムの様子が推測できたりもする訳です。
dammy

Credit

SeeAlso

OtherSubCategory

Footprint

Navigation