-PR-
解決済み

パスワード暗号化について(CGIスクリプト)

  • 困ってます
  • 質問No.74593
  • 閲覧数150
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 64% (50/78)

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

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

@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スクリプト)」にて質問させていただいています。
 どうかよろしくお願いします。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル10

ベストアンサー率 64% (73/113)

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

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

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

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

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

お礼率 64% (50/78)

 ということは、

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

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

 という感じの考察でした。ここで質問しなかったら、そしてわかりやすい回答が得られなかったらかなりの間分からずじまいになるところでした。
 とても助かりました。本当にありがとう御座いました。
投稿日時 - 2001-05-14 10:16:40
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル10

ベストアンサー率 64% (73/113)

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

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

お礼率 64% (50/78)

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

 余談

 しかしだとすると、DESというアルゴリズムで生成した際には$1$を最初の3文字として解釈してしまうのではないんでしょうか?
投稿日時 - 2001-05-11 17:05:35


このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ