パスワードなどを暗号化する際に使用するcrypt関数ですが、最適なsaltの求め方というのはあるのでしょうか。
最も多いと思われるのは、
srand();
@salts = ("A" .. "Z", "a" .. "z", "0" .. "9", ".", "/");
$salt = $salts[int(rand(64))] . $salts[int(rand(64))];
という、普通に乱数を使ったものですが、
結構有名なCGI RESCUEでは、
http://www.rescue.ne.jp/cgi/private2/crypt.cgi
ランダムな$keisuと時間を基に、かなり面倒(?)な方法を使っています。
これが何をやっているのか、いまいちわかりません。また、なぜこのような方法にするのか、ご教授のほどお願いいたします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
確かに一見して奇妙ですね。
どう考えても結局randを基にしているのだから、繰り返す意味は無いですよね。
他の方もおっしゃっているように、salt2文字を求めるコード自体を複雑にする効果は特にないと、私も思います(むしろ素直にrandを使ったほうが再現性は低い気がします)。
ご存知かと思いますが、cryptによって生成された暗号化文字の先頭2文字は使われたsaltになります(DESの場合)。なので、実際は暗号化された文字を見ればsaltは判明し、隠そうとする意味はありません。
saltは元の文字列から暗号化する際に56bitの数値を使って演算に加味するというだけの目的ですから、いつも同じものを使うことを避けさえすれば、salt自体を隠す意味はあまりないと思います(厳密には隠せない)。
で、このコードの理由については、あくまでも確信のない推測ですが、成り行きでこうなったとか、「特に意味がない」ということじゃないでしょうか。
良く見てみると、ループが、8文字のsaltに対応させることを容易にさせるためにも見え、MD5のことを考慮してか、あるいはMD5バージョンがあって書き換えたが処理は残っているとか。
そしてまた、timeとの%を取るというのはrandを使わずに乱数を求めるようなケースで昔はたびたび使われた手法でもあり、もともとそのような処理だったのが、randによる方法に改良した、しかしこれもやはり中途半端に残ってしまっている、というようなことではないでしょうか。
ご回答ありがとうございます。
言われてみれば確かにシャッフル?を8回繰り返してますね。これが8文字のsaltに関係する(してた)可能性はありそうですね。
if ($pwd =~ /^\$1\$/)というところは、まさしくMD5用でしょうし。
シャッフルはrandを使っておきながら、そこから1文字取る方法だけ時間などを使っていて、無意味というか意味が解らないですが、、、確かに書き換えを繰り返していくうちにこうなってしまった、と考えると納得できる気がします。
おっしゃるように、どうも特に意味がないというのが正解な気がしました。
その証拠?に、このサイトの最近のプログラムだと、こんな面倒なことしてないんですよね、、先ほど気づきました。そしてこれは古そうです。
本題の疑問だった、saltは単純にrandで良いということが解っただけでも良かったです。
No.4
- 回答日時:
古いバージョンのperlで動かす事を想定して、乱雑さを増すために、わざと何度もrandをコールする方法をとっているのでは。
最近のperlならあえてsrandを呼ばなくてもすむはずなので。
ソルトの出現確率が一律であるのが最適なので、内部にカウンタをもって0から4095まで順番に払い出すのがベストだったりして。
ご回答ありがとうございます。
なるほどrandの信頼性を補足するようなものですかね、、、。
いろいろなサンプルや信頼できそうな配布プログラムなども見てみましたが、結局どうやら単にrandでよさそうだという気がしてきています。
いまのところ古いバージョンを想定する必要もないので。
No.3
- 回答日時:
Salt文字列を固定ではなく、ランダムにして生成しているのは、Salt文字列と暗号化した文字列の表から、元の文字列を解読するのを難しくする為だと思います。
予め、いくつかのSalt文字列からの表があれば、同じSalt文字列を使用している暗号文字列を解読するのが容易になります。
パスワードをいくつも保存しているファイルがあれば、そのなかのどれかはSalt文字列が同じであるかもしれません。
また、同じSalt文字列が何度も現れていれば、その中で一番多いSalt文字列からその表を作れば、それだけ多くのパスワードが解読できます。
Salt文字列の再現性が低いほうがセキュリティが高いということになります。
なので、CGI RESCUEさんが、複雑な方法で、Salt文字列を生成しているのは、単純な方法でSalt文字列を生成するよりも、再現性が低いと、作成者が考えたからではないでしょうか。
実際に低いのかどうかは別ですが…(変わらないような気もします)
参考URL:http://www.nurs.or.jp/~ogochan/linux/crypt.html
ご回答ありがとうございます。
saltを再現性の低いものにするためランダムに、というのは理解しております。
>実際に低いのかどうかは別ですが…(変わらないような気もします)
そうなんですよ、、、これって、ランダムの文字列を作る方法として、「randを使う方法」と「時間などから演算する方法」とが、混ざっているようなんですよね。
いろいろ他のサンプルもかなり見てみましたが、どうやら単純にrandでよさそう、という気がしてきています。このプログラムだけの、ちょっと不思議な特徴、というところでしょうか。
No.2
- 回答日時:
>それでもやはり解析しにくいようにする必要があるのでしょうか。
サンプルとしての意味もありますからね。
>それほど難解or無意味な処理でもないように思えます
削除しても問題のないロジックが入っているわけではないですから。
複雑なロジックを実装するために必要な処理が入っているわけですから、単純な暗号の場合には、プログラムを複雑化するのも限界があります。
>これでは危険ということですか?
ソースコードを第三者に読まれてしまうケースでは、ロジックを複雑化することは「プログラマーとしてのセキュリティ意識を示す」ことに最大の意義があります。
実際には、やる気のあるハッカーにかかれば解析そのものは簡単なのですから、セキュリティの危険度は同じといえると思います。
でも、ガキのイタズラすら防げないという意味では、単純なソースコードは危険といえるでしょう。
この回答への補足
ご回答ありがとうございます。
何度もすみません。
どうもやはり私には、暗号化のロジックではなくsaltのロジックを複雑化する効果や意味が良く解らないのが正直なところです。
サンプルであるなら、むしろなおさら(他のサンプルのほとんどがそうであるように)理解しやすいように書くべきな気がするのと、逆にrandと書いたほうが解析できないと思うのですが…。
どうも、このプログラムだけの問題な気がしてきています。
しかし意義などの件は大変参考になりました。ありがとうございます。
No.1
- 回答日時:
>これが何をやっているのか、いまいちわかりません
そう思わせるためにわざと面倒な方法を使います。そのような場合、システム的には必要のないロジックがわんさか入ってたりします。
解析しやすかったら暗号の意味がないですから。
早速のご回答ありがとうございます。
なるほど、解析しにくいようにでしたか。
ただ、これは暗号化そのものではなくて、たった2文字のsaltを求めるだけですが、それでもやはり解析しにくいようにする必要があるのでしょうか。
また、カムフラージュ(?)的なことが目的にしては、それほど難解or無意味な処理でもないように思えます(最終的には2つの乱数を作っているだけ?)。
他の多くのスクリプトでは、質問文に書いたような数行の処理で済ませていますし…、これでは危険ということですか?
重ねてすみませんが、よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(セキュリティ) IDと暗証番号・パスワードの管理の画期的かつ簡単便利な方法を考案した。他人に検証してもらう方法は? 5 2023/02/08 08:49
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- CGI (フリーの)ツリー掲示版CGI、昔は多用させてもらいましたが・・今セキュリティ上どうでしょう? 2 2023/06/25 07:18
- CGI htmlからcgiを自動的に起動させたい 1 2023/02/21 19:39
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Java Java 配列<選挙> 4 2023/07/31 15:07
- CGI 古ーくからフリーのtree.cgi掲示板を利用させてもらって来ましたが、最新でなにか復活できないか? 2 2023/04/07 10:43
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- その他(ネットショッピング・通販・ECサイト) 11月1日に中国サイトで品物を購入しました私は何度もメールしていて4日に発送するとメールがあり5日の 6 2022/11/08 10:24
- X(旧Twitter) Twitterアカウント継続使用について 1 2022/05/14 09:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
日本語文字列の指定長(byte)切出し
-
splitの逆の処理
-
パイソンエラーについて
-
Perlで Right関数に近い処理を...
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
Excel VBAでPDFファイルをMicro...
-
Accessで日付や数値を全角で表...
-
データにカンマが入ったCSVデー...
-
EXCELからCSVにすると余計なカ...
-
「何とかで始まり、何とかで終...
-
エクセルで数値を全角文字(カ...
-
CString Format にて全角空白文...
-
住宅にカナを入力する際に丁目...
-
VBA EXCEL あるセルの中の一...
-
csvデータのダブルクォーテーシ...
-
正規表現で、特定の文字列を含...
-
各項目がダブルクォーテーショ...
-
ハングルを日本語に置換
-
Accessのテキストボックスの入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パイソンエラーについて
-
Malformed UTF-8 character
-
Perlで Right関数に近い処理を...
-
splitの逆の処理
-
GDBでデバッグするとき文字列の...
-
数字を文字列に変換し短縮化する
-
文字列と数字を含むセルから数...
-
日本語文字列の指定長(byte)切出し
-
メールヘッダのMIMEエンコード...
-
Perl(Windows)の文法について
-
プログラミング HSPの変数につ...
-
VBA like演算子について
-
Perl/Tk使用時のUTF-8コード文...
-
perlを使用しての特定行抽出に...
-
perlでのURL判定
-
perlで文字列を短く(圧縮)し...
-
cryptの使用方法
-
外部ファイルに「漢字(かんじ...
-
リストデータの検索でのエラー...
-
文字列操作:最後の4文字を取...
おすすめ情報