2011-11-10 8 views
0

ウェブサイトの簡単な登録とログインページ。私はパスワード+塩を暗号化しようとしています。それは私がやったことですが、正しいかどうかはわかりません。PHP暗号パスワード

これは、登録ページで何が起こるかです:

データベースで
$blowfish = '$2a$10$'; 
$salt = '8dF$d_3'; 
$hashedPass = crypt($password,$blowfish . $salt); 

、パスワード "RAYray99は" $ 2A $ 10 $ 8DF $ D_3」として保存され$$$$$$$$$$ $$$$。wxsfa7X.nkcGqldJ9fujdd8eY.H85uC」ログインページ


は、私は、データベース内のパスワードを入力したパスワードを確認する方法で立ち往生しています。

mysql_connect("$db_host", "$db_username", "$db_pass") or die(mysql_error()); 
//select the database or return error message 
mysql_select_db("$db_name") or die("database does not exist"); 

$email = stripslashes($_POST['email']); 
$email = strip_tags($email); 
$email = mysql_real_escape_string($email); 
$password = ereg_replace("[^A-Za-z0-9]", "", $_POST['password']); // filter everything but numbers and letters 
$password = crypt($password); 

$sql = mysql_query("SELECT * FROM members WHERE email='$email' AND password='$password' AND activateemail='1'"); 
$login_check = mysql_num_rows($sql); 
if($login_check > 0){ 
while($row = mysql_fetch_array($sql)){ 
    // Get member ID into a session variable 
    $id = $row["id"]; 
    session_register('id'); 
    $_SESSION['id'] = $id; 
    // Get member username into a session variable 
    $username = $row["username"]; 
    session_register('username'); 
    $_SESSION['username'] = $username; 
    // Update last_log_date field for this member now 
    mysql_query("UPDATE members SET lastlogin=now() WHERE id='$id'"); 
    // Print success message here if all went well then exit the script 
    header("location: account.php"); 
    exit(); 
} // close while 

} else { 
// Print login failure message to the user and link them back to your login page 
    print '<br /><br /><font color="#FF0000">ERROR TRY AGAIN </font><br />; 
    exit(); 
} 

私の質問は、私は、ログインpassswordは、データベース内の1で、ログインページで入力を検証する方法を次のとおりです。

このは、ユーザーを検証logingのPHPスクリプトです。

は、私は私のSQLクエリ(doctrine2)のためのマッパーを使用しています、 レイ

+0

代わりにパスワードを暗号化しないでください!あなたの ''タグを取り除いてください。それらは何年も使用されていません!最後に、RFCに従って、あなたの 'Location:'ヘッダは絶対URLでなければなりません。はい、相対的なパスは一般的には動作しますが、そうでない場合は問題になりたくありません。また、SQLインジェクションの対象となります。 **ストリッピングスラッシュは、SQLインジェクションに対する適切な保護**ではありません!準備されたクエリを使用してPDOを学習します。 – Brad

+0

なぜあなたはハッシュ(解読はほとんど不可能)の代わりにパスワードを暗号化しますか? パスワードをフィルタリングすると、より危険な状態になります。ところで、['ereg_replace()'](http://php.net/manual/function.ereg-replace.php)は非推奨です。 – ComFreek

+0

あなたの質問に無関係なヒントは、変数を引用符で囲む必要はありません。たとえば、あなたの接続呼び出しは、 'mysql_connect($ db_host、$ db_username、$ db_pass)' – jprofitt

答えて

0

、ありがとうございました。

私のパスワードは私のデシベルにMD5 +塩と一緒に保存されている

public function setPassword($password) { 
    $this->_password = self::encodePassword ($password); 
    return $this; 
} 
/** 
* This function encodes the password to md5 after adding a salt 
* @param string $password 
*/ 
public static function encodePassword($password) { 
    $salt = 'dsa7893ujlksdsagkz27392kjsjaldksju928ikljda27'; 
    return md5 ($password . $salt); 
} 

私のログインは、このようになります...

/** 
* Executes an authentication try 
* 
* @throws Zend_Auth_Adapter_Exception if the authentication failed 
* @return Zend_Auth_Result 
*/ 
public function authenticate() 
{ 
     //check if login is correct 
     try{ 
       $user = $this->_em->getRepository('App_Model_User') 
        ->findOneBy(
         array(
          '_email' => $this->_login, 
          '_password' => App_Model_User::encodePassword($this->_password) 
         ) 
       ); 
     }catch(Exception $e){ 
       throw new Zend_Auth_Adapter_Exception('authentication failed', 0, $e);    
     } 

.............

+1

'sha256'または' sha512'で 'md5'を置き換えることをお勧めします。 – ComFreek

+0

これらのアルゴリズムの長さはどのくらいですか? –

+0

ここにリストがあります:http://php.net/manual/en/function.hash.php#104987 – ComFreek

-1

@ブラッドは、パスワードを暗号化するのではなく、パスワードをハッシュする方が簡単であると指摘しています。

MySQLは、MD5とSHA1の両方のハッシュをサポートしています。

このルートを行くことの利点の一つは、あなたがいずれかを行うことができます:あなたは正確に入力1をハッシュする必要があるパスワードを確認するには、データベース

$SQL = "SELECT * FROM users WHERE username = '$user' AND pass = MD5('{$salt}{$pass}')"; 
+1

PHPの 'crypt()'関数は双方向の暗号化ではありません。名前は完全に間違っています(PHPベースライブラリに対して別の点を追加してください)。 PHPのドキュメントでは、関数のページで "crypt - 一方向文字列ハッシュ"と言うことさえあります。 – Tesserex

+0

あなたは大丈夫です、私はそれをmcrypt関数と混同し、確認しませんでした – rantsh

1

$pass = md5($salt . $pass); 
$SQL = "SELECT * FROM users WHERE username = '$user' AND pass = '$pass';"; 

、あるいは直接にあなたが最初にそれを保管したときと同じように。

あなたには何か問題があります。まず、crypt()のブローフィッシュの文字列は、PHPドキュメントに従って、$2a$10$の後に、アルファベットのアルファベットのアルファベットの文字が./0-9A-Za-zである必要があります。あなたの塩はそれに従っていないので、ハッシュ関数はおそらく完全に失敗するでしょう(私は確かではありませんが)。

また、あなたの塩はあなたのアプリでは定数であってはいけません。各ユーザーに一意で、ハッシュされたパスワードと共にdbに保存されるべきです。

最後に、これらの変換をハッシュする前にパスワードに変換しないでください。平文パスワードを入力とする関数を分割し、ハッシュされたパスワードを出力します。この機能は、パスワードを保存したときと、ログインを検証しようとしたときの両方で使用します。そうすれば、データベースと一致するはずです。

0
$password = $_POST['password']; 
$str = "$2a$10$8dF$d_3$$$$$$$$$$$$$$.wxsfa7X.nkcGqldJ9fujdd8eY.H85uC"; 

if (preg_match('/^(.{7})(.{7})(.+?)$/', $str, $m)) 
{ 
    $blowfish = $m[1]; 
    $salt = $m[2]; 
    $hashedPass = $m[3]; 
    $validHashedPass = crypt($password,$blowfish.$salt); 

    if ($validHashedPass == $hashedPass) 
    { 
      good pass 
    } 
    else 
    { 
      wrong auth 
    } 
} 
0

私は、このケース専用のクラスを用意しています。これは、sha1()ハッシング関数とPDOプリペアドステートメントを使用してSQLインジェクションを防止します。私はそれを見つけてここに投稿しようとしますが、もしそうでなければ、これはあなたへの私のアドバイスです:

  • 暗号化ではなく、ハッシュ関数を使用してください。
  • mysql_*はプリペアドステートメントをサポートしていないため、使用しないでください。 PDOを使用するか、または非常にレットのmysqliを使用してください。
+0

ありがとう、それを見つけたら投稿してください。乾杯 –