• ベストアンサー

Linux での暗号化の方法

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

  • posha
  • お礼率75% (9/12)

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

  • ベストアンサー
  • 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

  • PerlでLinuxのユーザー認証・管理プログラム

    ブラウザでLinuxのユーザー名とパスワードと入力して、 ユーザー認証してログイン後、Linuxユーザーの パスワードを自分で変更できるプログラムが作りたいのです。 /etc/passwdにパスワードが直接記録されていれば簡単なのでしょうが、 シャドウパスワードなので苦労しています。LinuxはFedora Core3です。 まず、/etc/shadowに記録されているような、 $1$ではじまる暗号化されたシャドウパスワードをPerlで作るには どのようにしたらいいのでしょうか。 pwconvのソースをみたらどんなアルゴリズムかわかると思い、 shadow-utilのSRPMをインストールしてみたりしましたがわかりませんでした。PHPのメーリングリストに $salt = substr(md5(microtime()), 0, 9); return crypt($password, "$1$" . $salt); このようなコードがあったのですが、これでは$saltが毎回 代わってしまい、よくある $salt=substr(暗号化されたパスワード,0,2); if(crypt($pass,$salt) ne 暗号化されたパスワード){ &err("パスワードが違います"); } のような認証ができないのではないかと思いました。 Linuxではどのようなアルゴリズムでシャドウバスワード を作り、パスワードの認証をしているのでしょうか。 つまり、簡単にいうとPerlでシャドウパスワードを使った Linuxユーザーのパスワード認証と パスワード変更ができないか、ということなのです。 また、Perlでシャドウパスワードなど作らなくても system()などを使ってLinuxのコマンドを使えば 各ユーザーの認証やパスワードの変更がブラウザでできるという場合は、 教えていただけないでしょうか。 どうかご教示ください。よろしくお願いします。

  • Linuxユーザのパスワードを空に

    する(useradd直後の状態)にはどうしたらいいのでしょうか? 空のパスワードを入れるために単にリターンだけすると 以下のようになりできません。 #passwd passuser↓ Changing password for user passuser. 新しいUNIX パスワード:↓ よくないパスワード: あまりにも短かすぎます 新しいUNIX パスワードを再入力してください:↓ パスワードが与えられていません パスワードが与えられていません パスワードが与えられていません passwd: 認証トークン操作エラー # どうすればパスワードが空のユーザに出きるでしょうか? userdelした後useraddするしかないのでしょうか?

  • パスワードの暗号化

    基本認証でアクセス制限をしているページがあります。 複数の人にそれぞれユーザID、パスワードを与えるのですが、 数が多くて一つ一つ暗号化するには手間がかかります。 パスワードを一気に暗号化できるようなソフトやCGIはないでしょうか?

    • ベストアンサー
    • CSS
  • パスワードを暗号化するCGI

    基本認証のパスワードを暗号化するCGIを作ったのですが、 基本認証で認証させようとしてもうまくいきません。 cryptで行った暗号化は基本認証には使えないのでしょうか?

    • ベストアンサー
    • CGI
  • ユーザー認証についての質問

    こんにちは。5dai@perl初心者です。 お仕事でCGIユーザー認証を作成することになりました。 比較的よくあるもので、ブラウザ上でユーザー名、パスワードを入力してログインボタンを押して 認証させ、ログインページを表示させます。 又、管理者がログインすると、ユーザー登録、削除やパスワード変更が 行なえるようにするつもりです。 cgiをPerlでやろうと思うのですが、やり方としてはWeb Server機のOSがSolarisなので、 Unix機に付属しているdbmをリスト(ユーザー名、パスワード)の記憶域として利用しようと思います。 そこでちょっと質問です。 1.CGIでの認証は、どのような方法が一番多いのでしょうか??   今回は、ブラウザ ←→ WEBサーバー ←→ cgi(perl) ←→ dbm 2.又、perlでよく利用するサイト(サンプルがある)があれば教えてください。   できれば、ユーザー認証のサンプルがあれば・・・。 もし、表現が変なところがあれば遠慮なく指摘して下さい。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • .htaccessを使ったBasic認証の、パスワードを暗号化にしたいです!

    初心者です。 今回初めてBasic認証と言うものを設置してみようと思うのですが、途中から分からなくなってしまいました。そこで色々と疑問が出てきているのですが、もしご経験者の方がおられましたら、よろしくお願いいたします。 質問1 パスワードを暗号化したいのですが、やり方がわかりません。telnetで試みたのですが、入ることが出来ませんでした。なので、暗号化されたパスワードを取得することが出来ませんでした。この場合はどうしたらよいものでしょうか? 質問2 パスワードはサーバーによって違うのでしょうか?探したところ暗号化パスワードを自動で生成してくれるようなツールがネット上にあったのですが、この生成してもらったパスワードはどこのサーバーでも使えるのでしょうか?暗号化の基準はみんな一緒でしょうか? 質問3 安全性についての疑問です。Basic認証でパスワードを暗号化した場合見られても、本当に分からないでしょうか?もし詳しい人が見たら、すぐに解読して入室できてしまうものでしょうか? もし、お一つでも分かることがありましたら、よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • 標準のシャドウパスワードからMD5へコンバートする

    標準のシャドウパスワードからMD5へコンバートすることにしました。 そして、/etc/pam.dファイルに適切な変更を行います。 次に何を行いますか? という問に対して 答えは「passwdプログラムを利用しているすべてのパスワードを手動で変更する必要がある」 聞きたいことは暗号化を変更する場合は常にpasswdコマンドでユーザのパスワードを変更しないといけないのでしょうか? 回答のほどよろしくお願い致します。

  • ApacheのBasic認証について

    お世話になります。 ここで、このような質問をしていいのかどうか迷ったのですが、 今ちょっと悩んでいる事がありますので、どうか力を貸してください。 Apacheの機能で、特定ディレクトリにユーザ認証を設定することができますよね? パスワードによるユーザ認証の設定をし、htpasswdコマンドでパスワードを設定すると、パスワードファイルに暗号化されたパスワードが入力されますよね。 今回やりたい事は、その暗号化されたパスワードを解読し、元のかたちにもどしたいのです。 どこかのホームページでは「割と簡単に解読されやすい」と書いていたのを見た気がするので、 実際にどのような手段でやると解読されてしまうのか、今、調査しています。 どなたか分かる方、どうかご教授ください。 または、参考になるホームページがあれば是非とも教えてください。

  • アドレスの暗号化について

    検索エンジン等で検索結果のアドレスが暗号化?されていますがどうすればできるのですか? 今回、ユーザーIDとパスワードを入力して検索するページを作成しているのですが、検索結果を複数ページに表示するのにリンクアドレスに引数として渡す方法を使用しています。 パスワードがばれないように暗号化して引数にしたいのですが、解読方法を含めて宜しくお願いします。

    • ベストアンサー
    • Perl
  • 【PHPで認証】パスワードの暗号化は無意味では??

    PHPにて会員専用ページを作りたいと考えているものです。 パスワードは暗号化すれば安全…と思っていました。しかしよく考えると暗号化されたパスワードをハッカーが盗んで自分のPCのCookieに入れたらなりすましが可能ではないのか?ということに気づきました。正規のユーザーもログイン後は暗号化パスワードをサーバーに渡してページごとに認証しているわけですから。 パスワードの暗号化は本当に意味があるのでしょうか? 暗号化されたパスワードは盗まれても問題ないのでしょうか? お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • PHP