0

ユーザーのパスワードを暗号化するためにコードを編集する方法を知りたいです。現時点では、ユーザーが送信する HTML フォームに入力するとcustomerRegister.php、クエリを送信する前に一連の検証が行われます。

customerRegister.php

registerUser($_POST['firstName'], $_POST['lastName'], $_POST['username'], $_POST['houseNo'], $_POST['StreetName'], $_POST['town'], $_POST['postCode'], $_POST['emailAddress'], $_POST['phoneNumber'], $_POST['password'], $_POST['conPassword'],$_POST['carRegistration'],$_POST['carMake'],$_POST['carModel'],$_POST['carYear'],$_POST['carEngineSize'],$_POST['carFuel']);

 function registerUser($firstName, $lastName, $username, $houseNo, $streetName, $town, $postCode, $emailAddress, $phoneNumber, $password, $conPassword, $registration, $carMake, $carModel, $carYear, $carEngineSize, $carFuel) {

      $registerQuery = new UserLoginQueries();

/********************************
SERIES OF VALIDATIONS
********************************/

$registerQuery->insertUser($firstName, $lastName, $username, $houseNo, $streetName, $town, $postCode, $emailAddress, $phoneNumber, $password);

これらの詳細は、クエリが実行される userLoginQueries.php に渡されます。

userLoginQueries.php

  public function insertUser($custFirstName, $custLastName, $username, $houseNo, $streetName, $town, $postCode, $email, $number, $pass) {
    $sth = $this->conn->prepare("INSERT INTO `customer`(`CustFirstName`, `CustLastName`, `HouseNo`, `StreetName`, `Town`, `PostCode`, `EmailAddress`, `PhoneNumber`, `Username`, `Password`) VALUES (?,?,?,?,?,?,?,?,?,?)");
    $sth->bindValue (1, $custFirstName);
    $sth->bindValue (2, $custLastName);
    $sth->bindValue (3, $houseNo);
    $sth->bindValue (4, $streetName);
    $sth->bindValue (5, $town);
    $sth->bindValue (6, $postCode);
    $sth->bindValue (7, $email);
    $sth->bindValue (8, $number);
    $sth->bindValue (9, $username);
    $sth->bindValue (10, $pass);
    $sth->execute(); 
  }

ユーザーがログイン情報を入力すると、次のクエリが実行されます。

  public function queryLogin($username, $password) {
    $sth = $this->conn->prepare("SELECT * FROM customer WHERE Username = ? AND Password = ? AND UserType = 'Customer'");
    $sth->bindValue (1, $username);
    $sth->bindValue (2, $password);
    $sth->execute();
    $count = $sth->rowCount();
    return $count;
    }

ユーザーのパスワードが暗号化されるようにコードを変更するにはどうすればよいですか?

4

3 に答える 3

2

実際には、salt を使用してhttp://en.wikipedia.org/wiki/Hash_function (一方向アルゴリズム)のハッシュ アルゴリズムでパスワードを保存する必要があります。http://en.wikipedia.org/wiki/Salt_( cryptography)を参照してください。

これの基本的な理由の 1 つは、データベースが侵害された場合に、攻撃者が実際のパスワードを知ることができないようにすることです。

単純なハッシュ アルゴリズムは sha-1 です。ここで使用方法を確認できますhttp://php.net/manual/en/function.sha1.php

ソルトを使用したハッシュ

以下が役立つ場合があります: -

$sth->bindValue (2, sha1($password . "random private stuff here as salt"));

次にパスワードを確認する場合は、入力したパスワードとソルトを実際の値とソルトと比較してください。これにより、ユーザーのパスワードを平文で保存しなくても、パスワードが正しいかどうかがわかります。

なぜ塩を使うの?

通常、一方通行の機能を元に戻すことはできませんが、力ずくで実行することはできます。これは、ハッシュ アルゴリズムを使用していても、一部のパスワードが脆弱である可能性があることを意味する場合があります。

于 2013-04-22T18:27:45.823 に答える
2

この回答をご覧ください: How do you use bcrypt for hashing passwords in PHP? の場合、ユーザーを登録するときに を呼び出して$hash = $bcrypt->hash('password'); 、パスワードのハッシュ バージョンをデータベースに保存するだけです。その後、次を使用してユーザーを確認できます$isGood = $bcrypt->verify('password', $hash);

于 2013-04-22T18:27:49.263 に答える
2

ここで覚えておくべき重要なことは、「暗号化」という言葉は間違っているということです。暗号化する能力は復号化する能力を意味しますが、これはパスワードにとって悪いことです。パスワードを解読することは決してありません。代わりに、ハッシュする必要がありますパスワード。ハッシュでは、複雑な数学の問題を使用して、テキスト入力 (パスワードなど) を非常に長い数値に抽出します。潜在的な数が長いほど、ハッシュの安全性が高くなります。ここで重要なことは、ハッシュを元に戻すことはできないということです。パスワードが「p4$$w0rd」で、結果のハッシュが「12345」の場合、「12345」から「p4$$w0rd」を取得する方法はありません。ユーザーを認証するには、誰かがログインしようとしたときに、そのユーザーが使用したパスワードのハッシュを計算し、それを保存したハッシュ値と比較します。パスワードをどこにも保存しません。これまで。はい、これは、失われたパスワードを回復するオプションをユーザーに提供しないことを意味します。リセットすることだけを許可します。

さらに、ハッシュだけでは十分ではありません。パスワード データベース自体は常に危険にさらされており、ハッカーはすでにハッシュ値を知っていることがよくあります。ハッカーは、特定のハッシュ値を生成するパスワード入力の既製のテーブルを作成するために多くのリソースを費やしてきました。したがって、私の例の 5「桁」のハッシュでは、「00001」から「99999」までのすべての可能なハッシュに対して事前に計算されたものがあります。「12345」の値は「p4$$w0rd」と一致しない場合がありますが、問題ありません。同じハッシュが生成されれば、それで十分です。ハッカーはこれを使用して、侵害されたデータベースを調べ、すべてのユーザーの有効な資格情報のセットを発見できます。このため、塩も必要ですパスワードをハッシュする前に。パスワードをソルトすると、送信された文字列を変更してからハッシュします。サンプルのパスワードを認証するときは、「p4$$w0rd」と照合する代わりに、まずユーザー アカウントのソルトを追加し、結果をハッシュします。クラッカーが私のハッシュを知っていて、テーブルで私のハッシュを生成する入力を検索できる場合、事前に計算されたすべてのハッシュ結果を壊すような方法でクラッカーの入力を変更するため、クラッカーにとってはもはや役に立ちません。これにより、彼はすべてのパスワードを力ずくで推測することに戻ります。

すべてのハッシュ アルゴリズムが同じように作成されているわけではないことを知っておくことも重要です。md5 などの一部のハッシュ アルゴリズムは、高速になるように特別に作成されているため、それらを使用して、より大きなテキスト ブロックを既知のサンプルとすばやく比較できます。これらのアルゴリズムは、パスワードで使用するには非常に適していませ。ハッカーは、考えられる多くのパスワードを非常に迅速に推測できるからです。超高速または特殊なハードウェアであっても、ハッカーが実際のパスワードを推測するのに非常に長い時間 (おそらく数世紀) かかるように、非常に遅いハッシュアルゴリズムが必要です。最良のアルゴリズムは動的に調整できるため、ハードウェアが時間の経過とともに高速化するにつれて、アルゴリズムはますます遅くなります。これらのアルゴリズムの例は、「bcrypt」と「scrypt」です。

最後に、最も重要な教訓は、独自の認証システムをまったく構築しようとしないことです。認証の問題は、機能しているように見えるものを簡単に作成できることですが、それでも微妙な点で欠陥があり、1 年後には 6 か月前にハッキングされたことに気付く場合があります。システムは、適切に作成された多数の単体テストに合格することさえあるかもしれませんが、それでもこれらの微妙な欠陥があります。プラットフォームで利用可能な事前に作成された認証モジュールに可能な限り依存する必要があります。これは、Facebook、Twitter、OpenID などを介してログインできる認証方式が普及している理由でもあります。

于 2013-04-22T18:40:05.593 に答える