• ベストアンサー

PHP PEAR AUTH 認証でのパスワードを忘れた場合

AUTHを利用しての、認証を行う場合、usernameとpasswordの カラムを持つテーブルを参照しますが、このpasswordは MD5でハッシュした値で、テーブルに格納しなければならないようです。 この場合、パスワードを忘れてしまった際など、テーブルを 見てすぐにpasswordの値が確認できないので不便です。 なのでテーブルに格納するパスワードは平文としたいと思います。 平文でpasswordを格納しても、'cryptType'=>"none"とすれば 認証は通りますが、やはり平文では心配な所があります。 良い解決方法があれば教えてください。

  • PHP
  • 回答数4
  • ありがとう数6

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

  • ベストアンサー
  • world99
  • ベストアンサー率64% (20/31)
回答No.3

こんにちは。 テーブルに、md5で暗号化したパスワードを格納する列と、平文のパスワードを格納する列を用意するというのは、如何でしょうか? つまり、認証時は、暗号化した列を使用し、パスワード忘れの際は、平文のパスワード列を利用します。

reokun5785
質問者

お礼

ありがとうございます。この発想は思いつきませんでした。 一般的には、どのようにするのが良いのでしょうか? テーブルの定義なども含めて参考サイトなどがあれば、教えてください。

その他の回答 (3)

  • world99
  • ベストアンサー率64% (20/31)
回答No.4

こんにちは。ANo.3です。 パスワード忘れ対応処理では、登録しているパスワードをメールで通知する方法が多いと思います。しかし、どのような実装方法が一般的なのかはわかりません。私が提案した方法だと、パスワード変更の際に、2つのカラムを更新しなくてはならない点以外は、問題がないはずです。新たにパスワードを発行するというANo.2のcopymasterさんが回答された方法もありだと思います。 経験を元に話をしましたので、特に参考にしたサイトはありません。すいません。 あと、私個人的な考えかもしれませんが、パスワード変更をさせない仕様というのが、少々気になります。

reokun5785
質問者

お礼

ありがとうございます。とても参考になりました。

回答No.2

パスワードを忘れたのなら 忘れたパスワードを呼び出すのではなく、 パスワードを再発行するのが妥当な手段だと思います。 個人的には、たとえ管理者でも、利用者が自分で変更した生のパスワード(それはひょっとしたら他のサイトでも使っているかもしれない)を見ることができるのはいかがなものかと思っています。

reokun5785
質問者

補足

パスワードは、こちら側で決定します。利用者にパスワードは変更させない予定です。引き続きお願いします。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

HTTPSにしてなければ平文でもMD5でもネット上でやり取りするデータは同じだからそんなに気にする必要はないと思います。 どこまでセキュリティーを高くしなければいけないかはサイトの運用次第ですし。

reokun5785
質問者

補足

平文でもMD5でもネット上でやり取りするデータは同じというのは、知りませんでした。では、元々、MD5はセキュリティとしは低いのでしょうか?

関連するQ&A

  • PEAR auth で認証ができません

    PHP初心者で、PEAR Authによるsqliteを使用して認証のテストを行っています。 コード: <?php require_once "Auth.php"; function loginFunction() { echo "<form method=\"post\" action=\"test_auth.php\">"; echo "<input type=\"text\" name=\"username\">"; echo "<input type=\"password\" name=\"password\">"; echo "<input type=\"submit\">"; echo "</form>"; } $dsn = array( 'phptype' => 'sqlite', 'database' => 'test.sqlite', 'mode'=>'0644' ); $options = array( 'dsn' => $dsn, 'table'=>"schedule_usr", 'usernamecol'=>"username", 'passwordcol'=>"password" ); $a = new Auth("DB", $options, "loginFunction"); $a->start(); if ($a->checkAuth()) { print("認証しました。"); }else{ print("認証していません。")); } ?> エラーなどは表示されませんが、「認証しました」が表示されません。 test.sqliteではschedule_usrテーブルに username=test password=1111を 入力してあります。パスワードはmd5()で変換したものを入れてありますが、 「認証していません」が表示されてしまいます。 コード自体に問題があるのでしょうか? ご教示願います。

    • ベストアンサー
    • PHP
  • PEARのAuth,Auth_HTTPの勉強をしています。

    PEARのAuth,Auth_HTTPの勉強をしています。 OS:Fedora10 言語:PHP5 MySQL:5.0 現在以下のような書き方で認証を行っています。 $AuthOptions = array( 'dsn'=>"mysql://test:test@localhost/testdb", 'table'=>"testable", 'usernamecol'=>"username", 'passwordcol'=>"password", 'cryptType'=>"md5", ); $a = new Auth_HTTP("DB", $AuthOptions); $a->start(); まず$AuthOptionsに初期値を入れて認証開始した($a->start();)します。 その後ユーザがパスワード欄に入力した値がpasswordcolの値が代入されると思います。 この代入された値は$AuthOptionsで自分で設定しているようにmd5で暗号化されます。 今のままではユーザが入力した値そのままでmd5に変換しその値を利用する事になります。 それでは困るので簡単にその値が見つからないようにpasswordcolの値に決まった文字列を追加した上でmd5での暗号化を行いデータベースに登録したいと思っています。 どのように記述すればよいのでしょうか? よろしく御願いします。

    • ベストアンサー
    • PHP
  • 【php】PEARのAUTHがうまくいかない。

    【php】PEARのAUTHがうまくいかない。 http://www.phpbook.jp/pear/pear_auth/ このサイトを見ながら auth の実験をやってるのですが、 どうやっても、 認証できません。 何が原因と考えられるでしょうか? $dns 設定は PEAR::isError($dns) にかけてみたところ うまく通ったので問題ないと思います。 データベースには user user pass 179ad45c6ce2cb97cf1029e212046e81 (testpass) と、ユーザーネームと、ハッシュしたパスワード値を入れています。 念のためにに、両方ハッシュしたのや、両方ハッシュしてないのも入れてます。 authライブラリは、xamppに最初から入ってたやつを使ってます。 ブラウザは firefox で確認しています。 カラム名や、DB名のつづり間違いとか、 設定位置間違いとかも 何度も確認しているので間違いないと思います。 パラメータは こんな感じです $params = array( "dsn" => "mysql://dbID:dbpass@ IP /dbname", 'table' => 'test__main', 'usernamecol' => 'test_us_id ', 'passwordcol' => 'test_us_pw', 'cryptType' => 'MD5', 'db_fields' => '*' ); エディタの文字コードはUTF-8です。DBの文字コードもUTF-8です。 認証ができないだけで、phpにエラーはありません。 mysql の バージョンは 5.1.22-rc-log php の バージョンは 5.2.4 もはや何が原因か思いつきません。 何が原因と考えられるでしょうか・・・。

    • ベストアンサー
    • PHP
  • pearの認証(Auth)ができません。

    下記のサイトを参考にして認証サンプルを作成しました。 http://blueeyesblue.cocolog-nifty.com/technote/2007/09/pearauthmdb2-e2.html 下記のコマンドを実行してインストール済みかを確認しました。 pear list -------------------------------------------------- Auth 1.6.4 stable MDB2 2.5.0b3 beta MDB2で正常にデータベースに接続できるかを確認しました。 問題なく接続できました。 下記のテキストボックスに値を入力して[Login]ボタンをクリックしたら下記のエラーが出力されました。 ・Username ・Password ※ログイン画面はAuthのデフォルト画面を使用しています。 [エラー] login failed テーブルは下記のように作成しています。 CREATE TABLE TBL_USER (  no BIGSERIAL PRIMARY KEY,  name VARCHAR(64) NOT NULL,  mail VARCHAR(128) NOT NULL,  password VARCHAR(128) NOT NULL,  del VARCHAR(1) DEFAULT '0' NOT NULL,  ins_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  ins_name VARCHAR(64) NOT NULL,  upd_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  upd_name VARCHAR(64) NOT NULL ); ※テーブルのpasswordフィールドに格納している値は下記のように生成して追加しました。 mkpasswd -l 7 php -r 'echo md5(*******);' ※md5に指定している値はmkpasswdで出力された値を指定しました。 サンプルコードは下記の個所のみを変更しました。 $options = array(  "dsn" => "pgsql://ユーザー名:パスワード@localhost/データベース名",  "table" => "TBL_USER",  "usernamecol" => "name",  "passwordcol" => "password", ); 正直、何が原因なのかわからず困っています。 どうかご存知の方がいましたらアドバイスいただけませんでしょうか。 また今まで認証は1から自作していましたがpearの認証は使いやすいみたいな記事を読んだので使用しようと思いましたが・・・ 自作の認証とpearの認証ではどちらがいいのでしょうか。 ご意見等、何でも構いませんので教えていただけませんでしょうか。 宜しくお願いします。

    • 締切済み
    • PHP
  • PEAR::AUTHにて情報の引き継ぎ

    初心者のため、幼稚な質問で大変申し訳ないです。 PEAR::Authにて認証ページを作っています。 login.php <?php require_once "Auth/Auth.php"; $params=array( "dsn" => "DB情報", "table" => "user", "usernamecol" => "username", "passwordcol" => "password", 'cryptType'=>"md5", 'db_Fields'=>"*" ); $objAuth = new Auth("DB", $params); $objAuth->start(); if($objAuth->getAuth()) { echo $objAuth->username . "としてログインしています。<br>"; echo "<a href=\"authtest.php\">テストページ</a><br>"; } ?> といった情報で、正常にログイン認証出来ています。また、$objAuth->usernameこの情報も正常に取れています。 次のテストページ(authtest.php)に飛んだ時に、 authtest.php <?php require_once "Auth/Auth.php"; $params=array( "dsn" => "DB情報", "table" => "user", "usernamecol" => "username", "passwordcol" => "password", 'cryptType'=>"md5", 'db_Fields'=>"*" ); $objAuth = new Auth("DB", $params); $objAuth->start(); if($objAuth->getAuth()) { echo $objAuth->username . "としてログインしています。<br>"; } ?> となっており、ログイン状態は続いていますが、$objAuth->usernameこれが取得出来ていません。 「としてログインしています。」 そもそもページが遷移してしまうと、このようなパラメータは取得出来ないのでしょうか? それとも記述に間違いがあるのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PEARでのAuth認証について

    ただいまPEAR入門を参考に勉強しているのですが 認証部分でつまずいてしまっています。 どなたか御教授いただけませんでしょうか。 簡単なログイン認証をするためにサンプル通りのコードを 作って表示テストを行うものなのですが 認証できたら「認証済みです」 できていなければ「ID/パスワードが違います」 と表示されるようなものです。 IDもパスワードもきちんと入れているのですが認証できないため 悩んでいます。 以下そのコードを書きますので助言いただけるとありがたいです。 *contents.php* <?php require_once("Auth.php"); function loginFunction($usr, $status){ require_once("loginForm.php"); } $params = array( "dsn" => "mysqli://pear:pass@localhost/pear", "table" => "auth", "usernamecol" => "username", "passwordcol" => "password"); $myAuth = new Auth("DB", $params, "loginFunction"); $myAuth -> start(); if($myAuth -> getAuth()){ print("認証済です。"); } ?> *loginForm.php* <?php switch($status){ case AUTH_IDLED : case AUTH_EXPIRED : $err = "ログイン期限が切れています。再ログインしてください。"; break; case AUTH_WRONG_LOGIN : $err = "ユーザID/パスワードが間違っています。"; break; } ?> <html> <head> <title>ログインページ</title> </head> <body> <form method="POST" action="<?php print($_SERVER['PHP_SELF']) ?>"> <table border="0"> <tr> <th align="right">ユーザID:</th> <td><input type="text" name="username" size="15" maxlength="20"></td> </tr> <tr> <th align="right">パスワード:</th> <td><input type="password" name="password" size="15" maxlength="20"></td> </tr> <tr> <td colspan="2"> <input type="submit" value="ログイン"> </td> </tr> </table> <font color="red"><?php print($err); ?></font> </form> </body> </html>

    • ベストアンサー
    • PHP
  • pear のAUTHでsetAuthDataで登録できません 教えてください

    サンプルで ログインできたときに ポイント入れようとしてるのですが setAuthdata でできるのではと思ったのですが 1:<?php 2:require_once "Auth/Auth.php"; 3:function drawLogin($username, $status, $objAuth) { 4: if (isset($_SERVER)) { 5: $server = $_SERVER; 6: } 7: else { 8: $server = $GLOBALS['HTTP_SERVER_VARS']; 9: } 10: echo '<form method="post" action="' . $server['PHP_SELF'] . '">' . "\n"; echo '<label for="username">ユーザー名:</label>'; echo '<input type="text" name="username">' . "\n"; echo '<label for="password">パスワード:</label>'; echo '<input type="password" name="password">' . "\n"; echo '<input type="submit" value="ログイン">' . "\n"; echo '</form>' . "\n"; } $params = array( 'dsn'=>"mysql://sample:password@localhost/test", 'table'=>"pear", 'usernamecol'=>"username", 'passwordcol'=>"password", 'cryptType'=>"md5", 'db_filds'=>"*" ); $objAuth = new Auth("DB", $params,"drawLogin"); $objAuth->start(); if($objAuth->getAuth()) { echo "ようこそ!" . $objAuth->username . "さん<br>"; // メールアドレスを取得。// $objAuth->setAuthData("point",10); } ?> こんな感じでいいのかと思いつくりました データーベースに書き込みされません エラーはでないのですが 教えてください お願いします

    • ベストアンサー
    • PHP
  • ユーザーパスワードのDBの格納について

    あるメーカーのソフトウェアを使用しており、Webからログインするときのユーザ名、パスワードがユーザーデータベースのテーブルに平文で格納されています。 そのソフトで使用しているデータベースはSQL Server 2008R2になります。 平文で格納されているのが気になっており、SQL Server 2008R2を使用してテーブルに格納するパスワードをハッシュ+ソルト+ストレッチングして格納すること仕組みとして可能かどうか気になっております。 もし仕組みとして可能な場合、Webからログインした際にユーザーが入力したパスワードをハッシュ+ソルト+ストレッチングして、テーブルに格納されているハッシュ+ソルト+ストレッチングしたパスワードと比較して認証を行うようにプログラミングは可能でしょうか。

  • パスワードのsaltの構築方法

    PHPでパスワードの登録でsaltを使用しようと考えているのですが、ネットで調べても自分の疑問に思っている事が出てきません。 パスワードにsaltという十分な長さ(40文字とか)の文字列を加え、それをmd5などでハッシュ化する・・・と言うことは分かりました。 しかしその実装方法が分かりません。 A.saltはランダム乱数でもいいし、セキュリティは低くなるが固定文字列でもいい。 B.saltは別ファイルに保管(一緒に保管と書いてあるのもありましたが)する。 、というような記事を見かけました。 で、自分はZendFrameworkのマニュアルに沿って考えたのですが、 データベーステーブルにpassword、saltカラムを作成する。 登録時、$_POST['ユーザの入力値']を(ハッシュ化する)passwordカラムに、saltはここでは単純にmt_rand(0,99)としてsaltカラムに登録、とした場合に認証時にはどのようにすればいいのでしょうか? 認証時にユーザの入力したパスワードとデータベースに格納したsaltを結合し、それをmd5()したものと、データベースに格納されているパスワードと同じく格納されたsaltを結合しそれをmd5()したものを比べる ・・・となるとパスワードさえ合って入ればいいので別にsaltは不要なような気がするのでこの実装法は間違っているのかなと思います。 そうではなく、登録時にユーザの入力したパスワードとデータベースに格納したsaltを結合し、それをmd5()したものをpasswordカラム又はsaltカラムに格納する・・・というのも正しいのかな?と思います。 データベースに侵入されればどちらもダメなので、何か別ファイルに保管するのかなとも思いましたが良く分かりません。 登録フォーム => ログインフォームにおいてのsaltの実装法を教えていただけないでしょうか?少し頭がぐちゃぐちゃになり、ちょっと文章がおかしい気もしますがすみません。

    • ベストアンサー
    • PHP
  • PEARのAuthを勉強中です

    OS:Fedora7 webサーバ:Apache2 言語:PHP5 +MySQL5、PEARのAuthでユーザー認証の勉強をしているのですが、文法以前の質問になると思います。 データベースに アクセス用のユーザー名・パスワード、認証用のユーザー名・パスワードをそれぞれ設定しました。 下記のコードをブラウザで表示しようとしても、真っ白な画面しか表示されません。 <html> <head> <meta http-equiv="content-type" content="text/html; charset=EUC-JP"> <title>ログインページ</title> </head> <body> <?php require_once("Auth/Auth.php"); function loginFunction($username, $status){ print("<form method=\"post\" action=\"pearauthtest2.php\">"); print("<table>"); print("<tr>"); print("<td>ユーザー名</td>"); print("<td><input type=\"text\" name=\"username\"></td>"); print("</tr>"); print("<tr>"); print("<td>パスワード</td>"); print("<td><input type=\"password\" name=\"password\"></td>"); print("</tr>"); print("<tr>"); print("<td colspan=\"2\"><input type=\"submit\" value=\"クエリ送信\"></td>"); print("</tr>"); print("</table>"); print("</form>"); } $params = array( "dsn" => "mysqli://authuser:authpass@localhost/kagaku", "table" => "auth", "usernamecol" => "username", "passwordcol" => "password" ); $authobj = new Auth("DB", $params, "loginFunction"); $authobj->start(); if ($authobj->getAuth()){ print("認証済みです"); }else{ print("認証されていません"); } ?> </body> </html> 入力フォームが表示されない理由がわかりません。phpinfo()でちゃんとPHPが動いているのは確認できています。 どなたかご教授願います。

    • 締切済み
    • PHP

専門家に質問してみよう