0

ログインシステムを持っています

たとえば、問題なくJoeユーザー名でログインできます。joe

現在、ユーザー名をソルトとして使用するパスワード暗号化を使用しています。これにより、ログインの問題が発生します。たとえば、

SELECT * FROM `users` WHERE LOWER(`username`) = LOWER(`:username`)
$stmt->bindValue(':username', $_POST['user']);

これは正常に機能します。問題はパスワードに関係しています。

SELECT * FROM `users` WHERE LOWER(`username`) = LOWER(`:username`)
   AND `password` = :password
$stmt->bindValue(':username', $_POST['user']);
$stmt->bindValue(':password', encrypt($_POST['password'], $_POST['user'])); //encrypt(password, salt)

ご覧のとおり、ユーザーがではjoeなくでログインしているため、パスワードの暗号化はデータベースをチェックしません。Joe

これに対する回避策はありますか、それとも他のものを塩として使用する必要がありますか?もしそうなら、私は塩として何を使うべきですか?これは私の暗号化機能です:

function encrypt($password, $salt) {
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($salt), $password, MCRYPT_MODE_CBC, md5(md5($salt))));
}
4

4 に答える 4

2

まずstrtolower($_POST['user'])、塩として使用する場合の問題は何ですか?うまくいくようです。

現在、一般的に、塩は予測できないはずです。ユーザー名は実際にはそれほど予測不可能ではないため、これが世界の終わりではありませんが、ユーザー名を適度な長さのランダムに生成された文字列に置き換えると、ユーザーのセキュリティが向上します(暗号強度がランダムである必要はありませんが、ただ予測できない)。

しかし、ここでの最大の問題は、しばらくの間安全でないと考えられてきたMD5の使用です。他のハッシュ関数に切り替えると、セキュリティが向上します。SHA-1は特に悪い選択ではありませんが(望ましくない特性があります。計算が高速です)、このようなアプリケーションに最適なのは、などの可変負荷率を持つハッシュ関数bcryptです。

于 2012-10-03T19:32:35.457 に答える
2

ここにはいくつかの問題があります。

  1. あなたのソルトの大文字と小文字の区別
  2. パスワード「暗号化」の方法

最初の問題はあなたが尋ねたものですので、それを見てみましょう。

したがって、パスワードはユーザー名でソルト化され、ユーザーがログイン中に入力したユーザー名をソルトとして使用できると予想されます。これは、ソルトの正規化スキームに落ち着いた場合に機能します。入力したまま使用する代わりに、関数で使用する前に小文字または大文字に変換してください。

もう 1 つのオプションは、データベースに対して 2 つのクエリを実行することです。これは最適ではありませんが、問題は最小限に抑えられます。

これに対する回避策はありますか、それとも他のものを塩として使用する必要がありますか? その場合、塩として何を使用すればよいですか?

あなたが尋ねたので、2 番目の問題を見てみましょう: パスワードの「暗号化」の方法です。

独自のパスワード ハッシュ/暗号化スキームを発明しようとすることは、多くの理由から決して良い考えではありません。最善の選択肢は、bcrypt や PBKDF2 の派生物など、すでに広く受け入れられているパスワード ハッシュ スキームを使用することです。どちらもソルティングとキーストレッチの両方が含まれているため、これらは優れています。それらは(とにかく比較的)遅くなるように設計されているため、これらのタイプのハッシュを総当たり攻撃すると、計算コストが非常に高くなります。

前述のパスワード ハッシュ スキームのいずれかを使用すると、最初の問題も解決されます。これらのスキームは組み込みのユーザーごとのソルトを使用するためです。これらのスキームの実装方法によっては、独自のソルトを提供する必要はありません (すべきではありません)。上位のライブラリがソルトを生成します。

パスワード ハッシュについては、次のライブラリを参照してください。

  • Openwall の PasswordHash クラス- PHP4 用に作成されていますが、最新バージョンでも動作します。bcrypt をサポートしますが、bcrypt がサポートされていない場合は独自のスキームにフォールバックします (ほとんどの場合、PHP < 5.3)。
  • Anthony Ferrara (ircmaxell) の PHP パスワード ライブラリ- 優れたライブラリですが、PHP 5.3 以降が必要です。
  • 私自身の PHPassLib - Anthony のライブラリに似ていますが、実装が異なります。3.x ブランチは、Python の PassLib に似せようとしています。また、PHP 5.3+ が必要です。
于 2012-10-03T19:52:53.017 に答える
1

あなたが抱えている問題は、ユーザー名をソルトとして使用すべきではないという理由の1つです。パスワードをハッシュするためのより良い方法は、を使用することですcrypt()。使用するランダムソルトを生成する必要があります。返される文字列にはハッシュとハッシュアルゴリズムが含まれているため、コードを書き直さなくても、必要に応じてアルゴリズムや難易度を変更できます。ハッシュが7ビットセーフである限り、文字列全体が安全であるため、base64_encode()何もする必要はありません。

于 2012-10-03T19:37:48.487 に答える
1

SQLをスキップし、lowerPHPを使用しますstrtolower()。そうすれば、ユーザー名は全面的に一貫したものになります。

于 2012-10-03T19:32:39.257 に答える