現在記事削除処理の、キー暗号化と解読について勉強しているんですが、他の方が書いたソースを読んでもさっぱり意味不明です。技術評論社さんのリファレンスを参考にしてるんですが、どうも載っていないワザが使われているらしく・・・。
まずは暗号化処理です(とある有名ソースから抜粋)。
@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スクリプト)」にて質問させていただいています。
どうかよろしくお願いします。
No.2ベストアンサー
- 回答日時:
いや、Perlのバージョンによるものではありません。
簡単に言うと、Perlの関数cryptは、内部でOS付属のライブラリcryptを
呼んでいるのです。そしてそれが返すものをそのまま返しているだけ。
例えばFreeBSDではデフォルトでMD5が使われます。しかしこれも
切りかえることができます。詳しくは知りませんがLinuxのいくつかの
ディストリビューションでもそうらしいですね。
正確には「OSの種類、バージョン、設定による」のです。
よって、Perlを利用するだけのユーザはどちらが使われているのか
調べてそれ用のコードを書くか、あるいはどちらでも大丈夫な
ように書く必要があるわけです。
> DESというアルゴリズムで生成した際には$1$を最初の3文字として解釈してしまうのでは
このコードがDESのときどう動作するか?という話ですか?
ならば先に左オペランドの「crypt($password, $salt)」が真の値を返しますから
「||」の働きによって後半の'$1$'を含むcryptは実行されず、次の行へ進んでしまい
ますので問題ありません。
ということは、
$encrypt = crypt($password, $salt) || crypt ($password, '$1$' . $salt);
において、MD5というアルゴリズムが使われた場合には左オペランドでエラーを返す(偽になる)ため、||演算子により右オペランドで問題なく真を返し、DESが使われた場合には左オペランドの時点で真を返してくれる、ということだったわけですね。ようやく||の謎が解けました。どうやら、初心者にはレベルが高すぎるソース表記だったようで(汗)。
という感じの考察でした。ここで質問しなかったら、そしてわかりやすい回答が得られなかったらかなりの間分からずじまいになるところでした。
とても助かりました。本当にありがとう御座いました。
No.1
- 回答日時:
OS(正確にはライブラリですが)によっては、cryptはDESではなくMD5のアルゴ
リズムによる暗号を生成します。このとき$salt先頭がアルファベットや数字
の並びだと失敗します。MD5だとsaltには「$1$」で始まる文字列を指定します。
実際にはそのあとに続く文字が使われる、とされています。
そこで、上記のようにすればプロバイダのサーバが使っているアルゴリズム
がDESでもMD5でもちゃんと動作するというわけです。
なるほど、最初が$1$だったのはライブラリの互換性を考えた設定だったわけですか。ライブラリによってということは、Perlのバージョンによってということでしょうかね?
余談
しかしだとすると、DESというアルゴリズムで生成した際には$1$を最初の3文字として解釈してしまうのではないんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Wi-Fi・無線LAN ルーターの暗号化キーはなぜ初期値から変更するの? 2 2022/08/11 16:28
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- その他(形式科学) RSA暗号について 1 2022/06/01 00:16
- その他(セキュリティ) IDと暗証番号・パスワードの管理の画期的かつ簡単便利な方法を考案した。他人に検証してもらう方法は? 5 2023/02/08 08:49
- その他(セキュリティ) HDDのデーターを暗号化したい。 3 2022/11/08 08:33
- Wi-Fi・無線LAN NECルーター AtermのPCとのWifi接続が出来た後 セキュリティ強化の為とあったので「暗号化 3 2022/06/30 23:11
- アプリ おすすめのパスワード管理アプリを教えてください。(iOSとWindows対応) 4 2023/01/19 02:08
- その他(職業・資格) 弁理士試験の勉強方法について 1 2022/09/11 07:32
- Windows 10 EFS(内容を暗号化してデータをセキュリティで保護する)はHomeエディションでは使えませんか??? 1 2023/05/20 18:16
- 防犯・セキュリティ 銀行の暗証番号、4ケタなのは何故ですか?アカウントは6文字以上大文字小文字アルファベット 10 2022/07/13 08:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
openした後、closeしないでプロ...
-
perlをバージョンアップしたら...
-
テキストファイルで提出とは?
-
Perlで時間の計算
-
アルファベットに付いて質問し...
-
perlでリテラル値はメモリにど...
-
TeraPadエディターの操作方法に...
-
Perlのエラーについてご教授く...
-
AI sisterとは、偽物の人ですか?
-
ファイルアイコンの左下に緑の□...
-
perlのrequireの動き方について...
-
perlのプログラミング 部分入れ...
-
Strawberry Perl for Windows ...
-
perl 初等プログラミングについて
-
arduino の割り込み処理について
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
bashスクリプト
-
perlプログラミング 空白行削除
-
perlで2次元配列をサブルーチ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
openした後、closeしないでプロ...
-
perlをバージョンアップしたら...
-
INDIRECT 横に再度抽出したい
-
Perl の外部モジュールの利用方法
-
Perlで特定文字列から特定文字...
-
Perlのエラーについてご教授く...
-
bashスクリプト
-
Strawberry Perl for Windows ...
-
perlで2次元配列をサブルーチ...
-
TeraPadエディターの操作方法に...
-
アルファベットに付いて質問し...
-
perlのflock関数でロックをかけ...
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
Wallpaper Engineでおすすめの...
-
Perlで時間の計算
-
perlのrequireの動き方について...
-
perlでリテラル値はメモリにど...
-
画像が表示でnull; this.src
おすすめ情報