0

重複の可能性:
PHP パスワードの安全なハッシュとソルト

私は自分のサイトの PHP スクリプトに取り組んでいます。それ自体が稼働しているサイトです。私が抱えている問題は、Web サイトへの登録が平文のパスワード用であることです。明らかに、これは非常に弱いセキュリティです。ハッシュパスワードを使用できるように、誰かがそれを変換するのを手伝ってくれることを願っています. 重要だと思われる登録コードの一部を含めました。関連性があるとは思わなかったので、ページにすべてのコードを含めたわけではありませんが、役立つと思われる場合は提供します。

require 'include.inc';
if ($signup) {

if ($signup[repassword] != $signup[password]) {
    $err_msg = "Your passwords do not match.";
error($err_msg);
}

if(!preg_match("^[_\.0-9a-z-]+$/i^", $str)) {
$msg = 'Invalid Username! Usernames can consist of letters and numbers only';
}
if(!preg_match("^[_\.0-9a-z-]+$^",$signup[password])) {
   $err_msg = "Invalid Password!  Passwords can consist of letters and numbers   only.";
}
  if(!$signup[password] || !$signup[username] || !$signup[email] || !$signup[username])
        $err_msg = "Oops! You forgot some important fields!";


  if (!$err_msg) {
$usercheck = @mysql_query("INSERT INTO user values(
    'NULL','$signup[fname]','$signup[lname]',
    '$signup[username]','$signup[password]','$signup[email]', 1, ".$pointInc.",     '$signup[referral]', NOW(), 'n', 'y')");

      // done, you are entered correctly, Now Enter the points and URL info


        $sql = "Select id from user where username='$signup[username]'";

    $result = mysql_query( $sql );
        if ( $result != false )
            {
        while ( $data = mysql_fetch_assoc( $result ) )
        {
            $point_set = $data['id'];

            }
        } else {
            echo mysql_error();
        }   
    // add rerral points

if ($signup[referral])  {
  $referralSql="UPDATE points SET points=points+ ".$refPoints . " WHERE     userid=".$signup[referral];
  $result = mysql_query( $referralSql );
                if ( $result != false )
                    {
                } else {
                    echo mysql_error();
                    }
    }                           


// add URL  

$sql="INSERT INTO url_table ( userid, website, active, datechanged) VALUES ($point_set,'".$signup[site_url]."','n', '".date("Ymd")."')";

  $result = mysql_query( $sql );
                if ( $result != false )
                    {
                } else {
                    echo mysql_error();
                }
// add points
    $sql="INSERT INTO points (userid, username, points) VALUES ($point_set,'     ',$signPoints)";
  $result = mysql_query( $sql );
                if ( $result != false )
                    {
                } else {
                    echo mysql_error();
                    }
    }
     echo mysql_errno().": ".mysql_error()."<br>";





            if (!$usercheck) {
       $err_msg = "Database error:<br>There was an error entering your account.<br>It is possible that username or Email already exists, please try another one.<br>";
         }   else {
            include ("reg.php"); 
            exit;
            }
     }
     if (!$err_msg) {
        // done, you are entered correctly



     }
   pageHeader($title, $bgColor, $styleSheet);
?>
4

5 に答える 5

2

基本原理は非常に簡単です。

1. ユーザーが登録するとき、平文のパスワードを保存するのではなく、hash(password).

$query = $pdoObject->prepare('INSERT INTO users (UserName, Password) VALUES (:u, :p)');
$query->bindParam(':u', $_POST['username']);
$query->bindParam(':p', hash($_POST['password']));
// Note that we don't store the password, we store the hash of the password. Once this script is done executing, no one involved in the website (except for the original user) will know that the password is
$query->execute();

2. ユーザーがログインしようとすると、ユーザー データベースに保存されているハッシュを使用して、入力したパスワードのハッシュを計算します。両方のハッシュが一致する場合、パスワードは正しいです。

$query = $pdoObject->prepare('SELECT * FROM users WHERE UserName = :u AND Password = :p');
$query->bindParam(':u', $_POST['username']);
$query->bindParam(':p', hash($_POST['password']));
// We locate the original user by searching for the hash of the password that they typed in

理論は以上です。考慮すべきいくつかの実際的な問題:

  1. 多くのチュートリアルでは、SHA1 の MD5 をハッシュ関数として使用することを提案しています。ただし、これらは安全ではありません使用可能なハッシュ アルゴリズムについては、 PHP ハッシュ ライブラリ(特にhash()関数) を確認してください。
  2. また、ソルト付きパスワードの使用も検討する必要があります。登録されたユーザーごとに、ランダムな文字列 ( salt ) を作成し、この文字列をユーザーのパスワードと連結してから、パスワードとソルトの両方をハッシュします (ユーザーの認証時にソルトが再び必要になるため、ソルトも保存する必要があります)。
  3. PDOを使用して、SQL をより安全にすることができます。これにより、 と呼ばれるものから保護されますSQL Injection。これを行わないと、ユーザーがアポストロフィ ( ') などの文字を入力して Web サイトを台無しにする可能性があります。
于 2013-01-23T13:36:12.400 に答える
0

md5 関数を使用して、パスワードのハッシュを作成できます。例:

$password = '12345';
$password = md5($password);

このハッシュをデータベースに保存し、ログイン用のユーザーとパスワードを確認するときにこれを行います

$post['password'] = md5($post['password']);

データベースに保存されているハッシュと等しいかどうかを確認します。md5 は最高のハッシュではありませんが、シンプルでセキュリティ レベルが高いことはわかっています。

于 2013-01-23T13:35:45.293 に答える
0

cryptパスワードのハッシュに使用します。

于 2013-01-23T13:41:24.123 に答える
-1

一部の意見は、md5 または SHA-1 が壊れやすいとは考えていません。

于 2013-01-23T14:35:49.473 に答える
-1

そのhttp://php.net/manual/en/function.md5.phpにはmd5を使用してください

uniqid も参照してくださいhttp://php.net/manual/en/function.uniqid.php

パスワードを平文でデータベースに保存することは、常に悪い習慣です。この他の質問を確認してください: PhP を使用して MySql に保存されたパスワードを暗号化するためのベスト プラクティスは何ですか?

于 2013-01-23T13:37:34.050 に答える