Perl についての質問です。


大変初歩的な事なのですが、HTMLでのフォーム上でパスワードと
ユーザーIDを入力してもらい、それをPOSTで受け取ります。

そこで、疑問なのですが、CGIのソース内にパスワードとユーザーIDを
正しいかどうか判定する場合、皆さんはどうなさっているのでしょうか?

自分は、外部テキストファイルにパスワードとユーザーIDを書き込んでおき、
それをOPENで読み込んで、比較しています。

しかし、これはCGIのソースなどを読まれた場合、あっさりばれてしまうのではないでしょうか?

他の方はパスワードを比較する場合などはどうされているのでしょうか?

回答の条件
  • URL必須
  • 1人20回まで
  • 登録:2007/03/26 15:20:48
  • 終了:2007/04/02 15:25:03

回答(6件)

id:takashi_m17 No.1

たか回答回数104ベストアンサー獲得回数122007/03/26 15:33:01

ポイント19pt

外部テキストファイルへのパスワード、IDの書き込みを暗号化させればどうでしょう

パスワード暗号化

http://www.hidekik.com/cookbook/p2h.cgi?id=makecrypt


パスワードチェック

http://www.hidekik.com/cookbook/p2h.cgi?id=chkpwd

id:zachouR

ありがとうございます!

2007/03/27 17:59:55
id:ootatmt No.2

ootatmt回答回数1307ベストアンサー獲得回数652007/03/26 15:34:35

ポイント19pt

基本的にそのような処理になると思います。

パスワードファイルは外部からアクセスできない場所に置いておきます。

また、外部ファイルに保存しておくパスワードはMD5ハッシュなどで暗号化しておき、そのファイルが読まれても直接パスワードが分からないようにしておくといいと思います。


パスワードが正しいかどうかを比較するときには、暗号化されたパスワードと入力されたパスワードのハッシュを比較すれば正しいかどうかが判定できます。

※ ここでの暗号化というのはハッシュ値のことです。復号できないので正しくは暗号ではありません。


http://www.ipa.go.jp/security/awareness/vendor/programming/b09_0...

この中の「メッセージダイジェストを使った認証」が参考になるかと思います。

id:zachouR

ありがとうございました、参考にさせていただきます!

2007/03/27 18:00:11
id:b-wind No.3

b-wind回答回数3344ベストアンサー獲得回数4402007/03/26 15:43:14

ポイント18pt

unix_md5_crypt - 相互に利用可能なMD5ベースのcrypt()関数を提供します

MD5 等のハッシュ関数でハッシュ化しておき、それを比較する。

ハッシュ関数は一方向性なのでそのデータから元のパスワードを再生成する事は不可能。

比較するときは POST されたデータをパスワード生成時と同じ方法でハッシュ化すれば確認できる。

id:zachouR

いつも、ありがとうございます!

2007/03/27 18:00:22
id:nandedarou No.4

nandedarou回答回数230ベストアンサー獲得回数342007/03/26 15:48:47

ポイント18pt

私は、データベースに保存しています。


保存するパスワードはMD5など不可逆性の暗号で暗号化して保存。

POSTされたパスワードを暗号化して、保存されたパスワードと一致すれば、ログイン。

こうすれば、もし、見られてもある程度大丈夫です。

外部テキストファイルに保存する場合も、パスワードは、暗号化しておくのがよいでしょう。


また特に、外部テキストファイルに保存する場合は、Webから直接アクセスできないように工夫する必要があります。

(A)public_htmlなどの公開フォルダの外にパスワードファイルを置く。

(B)public_htmlなどの公開フォルダ以下におく場合は、そのファイル専用のフォルダをつくり.htaccessの設定で、Webからアクセス不可能にする。

(C)CGIファイル内にパスワードを書く場合、他のファイルからインクルードされた場合のみ動作するようにし、もし、直接アクセスされた場合は、動作を停止するようにコードを書く。

http://q.hatena.ne.jp/answer ダミー

id:zachouR

DBは、ある事情で使えないのですが、今後の参考にさせていただきます!

2007/03/27 18:00:43
id:kurukuru-neko No.5

kurukuru-neko回答回数1844ベストアンサー獲得回数1552007/03/26 15:49:16

ポイント18pt

入力されたパスワードを暗号化して

保存された暗号化済みデータを比較する方法

もある。

mcrypt

http://jp.php.net/manual/ja/ref.mcrypt.php

http://pear.php.net/

id:zachouR

ありがとうございます!

参考になります!

2007/03/27 18:00:54
id:llusall No.6

llusall回答回数505ベストアンサー獲得回数612007/03/26 15:59:53

ポイント18pt

>外部テキストファイルにパスワードとユーザーIDを書き込んでおき

拡張子を特殊なものに変えておき、直接URLを叩かれても表示されないよう、

WEBサーバの設定を行ったほうがいいですね。


通常、ユーザ・パスワードはデータベースに格納事が多いと思います。

ブラウザからPOSTされてきたユーザ・パスワードとデータベースのそれとを

照合することにより、認証を行います。


よりセキュアにする場合は、データベースに生のパスワードは格納しておきません。

ユーザ情報の登録時に、「サーバ側で大切に保管してある秘密鍵」と「パスワード」

とでMD5等でハッシュ値を生成して、それを格納します。


ブラウザからPOST時は、同じく「秘密鍵」と「POSTされたパスワード」からハッシュ値を

生成し、データベースに格納されているハッシュ値と照合することにより、

認証を行います。


以下、すこし冗談ですが、

仮に悪意のあるユーザに、SQLインジェクション等で利用者マスタをごっそり引っこ抜かれたとしても、

パスワードがハッシュ値であれば、「やや安心かなw」

と言った利点があります。

MD5 出典: フリー百科事典『ウィキペディア(Wikipedia)』

id:zachouR

わかりやすく答えていただいてありがとうございます!

2007/03/27 18:01:12
  • id:b-wind
    暗号化とハッシュ化は違う。
  • id:llusall
    みんなと同じようですので、開かないでください。
    途中でオシッコしてたら、だいぶ出遅れました。orz
  • id:nandedarou
    >暗号化とハッシュ化は違う。
    「不可逆性」の暗号化≒ハッシュ化 という論理で書きましたが、
    確かに、正確には「ハッシュ化」です。
  • id:llusall
    ですが「暗号化+MD5」の検索でもずいぶんと"セット"でヒットします。

    「プレーンテキスト」に対して「暗号化された文」という意味合いで、通常は引用されるのですかね。

    私も結構言ってしまいます。

  • id:b-wind
    >ですが「暗号化+MD5」の検索でもずいぶんと"セット"でヒットします。
    よくある誤解と言うやつですね。

    回答者は全員分かっているようですが、実装を云々言う場面では不適切だと思います。
  • id:nandedarou
    >「プレーンテキスト」に対して「暗号化された文」という意味合いで、通常は引用されるのですかね。
    そうですね、そういう考えもある意味ありだと思います。
    私の場合、「暗号化」の方がイメージが即伝わる可能性が高いため、その言葉を選択しました。「(※正確にはハッシュ化と言う)」などと注意書きを入れるとよかったなぁと思いました。
  • id:b-wind
    で、一応補足。
    現時点で本当に「暗号化」について説明されているのは1番と5番の回答だけです。
  • id:dokatta
    b-wind さん 落ち着きましょう

    初心者に近い人にハッシュ化という表現は、あまり的確でない場合もあります
    暗号と書いてある = 間違い と断定してしまうと、いらぬトラブルを招きかねません

    b-windさんが 一流である事に異存はありませんが、
    他人の採点をするのは、さすがに行き過ぎです

    私は、nandedarouさんの説明もわかりやすいと思うし
    (素直なつくり)
    ootatmtさん のアドバイスも的確だと思います
    もちろん b-windさんのいう事が 正しいのは 言うまでもありませんし、尊敬しております

    差し出がましい事かもしれません。気に障るようなら ごめんなさい
  • id:llusall
    dokattaさん、ちょっとまってください。

    b-windさんは、他人の採点なんかしてませんよ。
    >1番と5番の回答だけです。
    この部分ですよね。

    まったく別の回答であり、回答が二分化されているということを明言しただけです。

    dokattaさんは、回答1~5が皆同じ内容・・・
    と思っていたりしませんか?

    実は、2種類の回答が存在しています。

    そういった誤解を招かないためにも、

    「暗号化とハッシュ化は違う。」
    と言っておられるのです。
  • id:dokatta
    llusall さん すみません
    私の勘違いでした
    b-wind さん、 ご迷惑おかけしました もうしわけありません

  • id:llusall
    実は私も、b-windさんが
    「1番と5番の回答だけです。」
    といわれるまで、全部ハッシュの回答だと思っていましたw
  • id:kurukuru-neko
    薬が回っていたのぼけた回答してます。
    完全にPHPと思って回答してます。
    今まで全く気がつきませんでしたすいません。

    Perlだとcryptの簡単な実装例があります。
    http://home.kanto-gakuin.ac.jp/~ahero/perl/crypt/

    Perlだと
    Cryptモジュール
    http://perldoc.jp/docs/modules/
    http://search.cpan.org/search?query=Crypt%3A%3A&mode=module

    Mcryptモジュール
    http://cpan.uwinnipeg.ca/htdocs/MCrypt/MCrypt.html
  • id:nandedarou
    >実装を云々言う場面では不適切だと思います。
    (上記の回答の順番で、私がこの発言を無視したように見えるかもしれませんが、コメントするタイミングによるものですので、誤解されぬようお願いします。)
    確かに、そのとおりですね。正確かつ分かり易い回答を心がけたいと思います。

    質問者さんが次に気になるのは、「ハッシュにするか暗号にするか」のような気がします。

    考慮すべきは、
    1.保存したファイルを見られた場合の危険性
    2.復号化の必要性
    3.実装のし易さ
    などでしょうか?

    ちょっと、考えてみました。

    パスワードを復号化する必要はないので、2は考慮しなくていい。
    実装しやすさは、MD5でしょうか?
    あまり、Perlを使わないので、この辺わかりません。
    一番重要なのは、1.の危険性でしょうか?

    プログラムのコードとパスワードを保存したファイルを両方見られたとき、暗号化だと複合化されやすいので、ハッシュより危険とも考えられる。

    でも、同一ハッシュ値の文字列を探し出すソフトもあるので、それを前提にすると、ハッシュも危険。

    そこで、ユーザーのパスワードをハッシュ化する際に、特定の文字列をプラスしてからハッシュ化したら、少し危険性は減るかなぁ…。などと考えてみました。

    ただし、やはり、プログラムのコードとパスワードを保存したファイルを見られないようにするのが、まずは大切ですよね。

    ほんとにちょっと考えただけなので、ご批判があれば、是非お願いします。
  • id:kurukuru-neko
    HMACのようなものもあります。

    Apacheで認証も強化
    mod_auth_form
    http://module.jp/blog/authentication_from_apache.html

    mod_deny_deeplink
    http://module.jp/mod_deny_deeplink/

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません