• ベストアンサー

Linux での暗号化の方法

ホームページにおいて、特定のユーザーしかアクセスできないようなページを作るために、パスワードによる認証を行おうと考えています。 perl による cgi を使う予定なのですが、プログラム中に if ($passwd ne "Test") {~~} などと書いたら、プログラムを見れる立場にある人間がみたら一目瞭然でパスワードを知られてしまいます。 そこでお聞きしたいのですが unix の /etc/passwd は暗号化されていて、ユーザーがそれを見ても簡単には解読できないと思います。perl の cgi から、同レベルに暗号化および認証することは可能ですか? 可能だとしたら、そのための方法などを教えてください(たとえば、それを行う便利なシステムコマンドや、フリーウェアがあるなど)。 ついでに、向学のためのウンチクとして、unix のパスワードの仕組みなどもお聞きできるとうれしいです(たしか、/etc/passwd からは絶対にデコードできないと聞いたことがあるのですが)。 よろしくお願いします。

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

  • ベストアンサー
  • nyan_nyan
  • ベストアンサー率46% (18/39)
回答No.1

UNIXのと同レベルかどうかは、判りませんが、 Perlのコマンドにcrypt(Unixのコマンドにも同様のがあります)というのが あります。 詳しくはリファレンスを見てほしいのですが、 $val = crypt $password, $salt; $val <- 暗号化された文字列 $password <- 暗号化する文字列 $salt <- 暗号化に使うキー(英数字2文字) cryptで暗号化された文字列は複合化する方法が基本的にありません。 cryptに渡す$passwordと$saltが同じ物なら、当然同じ結果を返します。 なので、認証を行うときは、 すでにcryptされたデータと、入力されたデータのcryptした結果を 比較することになります。 普通は、 $val = crypt $password, $password; という使い方をすると思います

posha
質問者

お礼

ありがとうございます! ほんとにありがとうございます! crypt なんていう便利なコマンドがあるって、はじめて知りました。 実際に print (crypt ("test", "test")."\n"); などと実行してみると、みごとに暗号化された文字列が吐き出されました。これからテストを繰り返すことになると思いますが、十分にいけそうです。 ほんとうにありがとうございました。

その他の回答 (2)

  • selenity
  • ベストアンサー率41% (324/772)
回答No.3

MD5には1方向性関数が使用されており、 この1方向性関数は数学的に逆演算が 出来ないことが証明されていたはずです。 そのため、「考えられる組み合わせの総当たりで 確かめる」しか方法がないのです。 MD5にはもう1つ入力データ長に関らず、固定長の データを出力すると言うという特徴があるので、 いろんな長さの文字列を変換して、常に一定長に なるようであればMD5でしょう。 一方、cryptの方ですが、これはOSの暗号化機能を 使う場合があるのでMD5とは限りません。

posha
質問者

お礼

ありがとうございました。 「常に一定長になれば・・・」 という部分から、perl の crypt コマンドによるエンコードも おそらく MD5 であろうと推測できました。

  • selenity
  • ベストアンサー率41% (324/772)
回答No.2

メインのperlの方は分からないので他の方に お任せします。 phpであればcrypt()、md5等のphp関数がありますので 多分perlにもあるでしょう。 UNIXの/etx/passwdファイルは、最近ではセキュリティ の観点から、このファイルにはパスワードは含まれていません。 その代わり誰でも開けます。 んで、パスワードの本体はOSによって異なりますが、 FreeBSDであれば/etc/master.passwd Linuxなら、/etc/shadow ファイルに含まれています。 当然暗号化された状態でですが、、、 FreeBSD/Linuxのパスワードの暗号化にはMD5という 技術が使用されており、このMD5は基本的には 逆方向の演算はできない仕組みになっています。 したがって、解析には総当たりのチェックを することになります。 つまり、パスワードとして使用可能な8文字の 組み合わせ全部を試すことになります。 MD5が使用されている場合、パスワードフィールドが 「$1$」で始まっています。 MD5以外ではDESが使われている場合もあります。 DESの場合は「$1$」で始まらないので簡単に区別できます。

posha
質問者

お礼

selenity さん、ご回答ありがとうございます。 質問しておいてなんですが、僕の頭脳では理解できないということがわかりました。(^-^; しかしながら、もっとも重要な「MD5は逆方向の演算ができない」という点をお聞きできたので、安心できました。ちなみに、crypt 関数にも、当然のごとく MD5 という技術が用いられてるわけですよね? 平たく言うと「crypt による暗号も不可逆」と考えて大丈夫ですね? そこだけ確認させてください。よろしくお願いします。

関連するQ&A