プロが教えるわが家の防犯対策術!

 現在記事削除処理の、キー暗号化と解読について勉強しているんですが、他の方が書いたソースを読んでもさっぱり意味不明です。技術評論社さんのリファレンスを参考にしてるんですが、どうも載っていないワザが使われているらしく・・・。

 まずは暗号化処理です(とある有名ソースから抜粋)。

@SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/');
srand;
$salt = $SALT[int(rand(@SALT))] . $SALT[int(rand(@SALT))];
$encrypt = crypt($password, $salt) || crypt ($password, '$1$' . $salt);

問題は$encryptなんですが、||演算子は、要するに左オペランドの保険みたいなものなんでしょうか?まず、左オペランドが偽になる、ということ自体が分かりません。結果が偽になる、というのは0を返すということでしょうか?
 crypt関数が処理を失敗する(?)、ということでも偽になるかもしれないんですが、暗号化処理を失敗などということがあるのでしょうか?
 次に、ひとまず左オペランドが偽だった場合ですが、右オペランドに関して、暗号化キーが「$1$xx」の5文字ですよね。暗号化キーは2文字までしか評価されないから、結局これは「$1」と変わらない気がします。というより、まずなぜ「$1$」なんでしょうか?そして、合計5文字の意味は・・・?謎は深まるばかりです。

 質問の長さが800文字を超えてしまうので、前半はここで切らせていただきます。
 後半は「パスワード解読について(CGIスクリプト)」にて質問させていただいています。
 どうかよろしくお願いします。

A 回答 (2件)

いや、Perlのバージョンによるものではありません。


簡単に言うと、Perlの関数cryptは、内部でOS付属のライブラリcryptを
呼んでいるのです。そしてそれが返すものをそのまま返しているだけ。

例えばFreeBSDではデフォルトでMD5が使われます。しかしこれも
切りかえることができます。詳しくは知りませんがLinuxのいくつかの
ディストリビューションでもそうらしいですね。

正確には「OSの種類、バージョン、設定による」のです。
よって、Perlを利用するだけのユーザはどちらが使われているのか
調べてそれ用のコードを書くか、あるいはどちらでも大丈夫な
ように書く必要があるわけです。

> DESというアルゴリズムで生成した際には$1$を最初の3文字として解釈してしまうのでは

このコードがDESのときどう動作するか?という話ですか?
ならば先に左オペランドの「crypt($password, $salt)」が真の値を返しますから
「||」の働きによって後半の'$1$'を含むcryptは実行されず、次の行へ進んでしまい
ますので問題ありません。
    • good
    • 0
この回答へのお礼

 ということは、

$encrypt = crypt($password, $salt) || crypt ($password, '$1$' . $salt);

において、MD5というアルゴリズムが使われた場合には左オペランドでエラーを返す(偽になる)ため、||演算子により右オペランドで問題なく真を返し、DESが使われた場合には左オペランドの時点で真を返してくれる、ということだったわけですね。ようやく||の謎が解けました。どうやら、初心者にはレベルが高すぎるソース表記だったようで(汗)。

 という感じの考察でした。ここで質問しなかったら、そしてわかりやすい回答が得られなかったらかなりの間分からずじまいになるところでした。
 とても助かりました。本当にありがとう御座いました。

お礼日時:2001/05/14 10:16

OS(正確にはライブラリですが)によっては、cryptはDESではなくMD5のアルゴ


リズムによる暗号を生成します。このとき$salt先頭がアルファベットや数字
の並びだと失敗します。MD5だとsaltには「$1$」で始まる文字列を指定します。
実際にはそのあとに続く文字が使われる、とされています。

そこで、上記のようにすればプロバイダのサーバが使っているアルゴリズム
がDESでもMD5でもちゃんと動作するというわけです。
    • good
    • 0
この回答へのお礼

 なるほど、最初が$1$だったのはライブラリの互換性を考えた設定だったわけですか。ライブラリによってということは、Perlのバージョンによってということでしょうかね?

 余談

 しかしだとすると、DESというアルゴリズムで生成した際には$1$を最初の3文字として解釈してしまうのではないんでしょうか?

お礼日時:2001/05/11 17:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!