2

私はペットプロジェクトに取り組んでおり、ユーザーサインアップサポートを追加したいと思っています。調査の結果、ハッシュ化されたパスワードとソルトをデータベースに保存し、元のパスワードは保存しないことにしました。しかし、私はステップが何であるか、そしてどのような順序であるかについて混乱しています。以下は私の仮定です:

サインアップ

  1. クライアントはユーザー名とパスワードをサーバー(https)に送信します
  2. サーバーはパスワードを取得し、ランダムなソルトを生成します
  3. Base64はソルトをエンコードします
  4. stringifysaltでパスワードをハッシュします
  5. Base64はパスワードをエンコードします
  6. パスワードとソルトをデータベースに保存します

ログイン

  1. クライアントはユーザー名とパスワードをサーバー(https)に送信します
  2. サーバーはユーザー名とパスワードを取得し、データベースからハッシュされたpswとsaltを検索します
  3. ソルトを使用してパスワードをハッシュし、base64で結果をエンコードします
  4. パスワードをデータベース内のハッシュされたpswと比較します
  5. 一致する場合は、ユーザーを認証します

私は自分のシステムを前提として実装していますが、すべてが機能しているようです。ただし、base64エンコーディング部分についてはよくわかりません。パスワードとソルトをバイナリから文字列にエンコードする目的は何ですか?この手順をスキップできますか?そして、私の想定したプロセスが間違っている場合、正しい手順は何ですか?

PS私はサーバーとしてexpress.jsを使用し、データベースとしてmysqlを使用しています

4

2 に答える 2

3

一般的な考え方はOKですが、いくつかの発言があります:

  • ハッシュを使用する代わりに、パスワード ベースのキー派生関数である PBKDF を使用する必要があります。PBKDF2 などの標準化されたバージョンを使用することをお勧めします。塩と一緒に、攻撃を阻止するための反復回数も選択する必要があります。
  • ユーザー名とパスワードには常に同じ文字エンコードを使用してください。
  • 暗号化アルゴリズムは、バイナリの入力と出力に基づいている必要があります。
  • バイナリ データをテキスト プレゼンテーションに保存またはロードするときは、それぞれ Base 64 エンコーディング / デコーディングを使用する必要があります。

したがって、スキームには次の問題が含まれます。

  • PBKDF の代わりにハッシュを使用します。
  • base 64 でエンコードされたソルトをハッシュの入力として使用します。
于 2013-01-24T21:34:47.317 に答える
0

塩の意味を理解する必要があります。レインボー テーブルを使用してブルート フォース攻撃の可能性に対して障害物を投げるだけの方法です。つまり、悪者が生成可能なすべてのハッシュを高い計算能力で試します。次に、そのようなハッシュからプレーン テキストを抽出してみてください。
したがって、salt は、そのような攻撃があっても、返されたプレーン テキストが正しいものではないことを確認するために存在します。

例: ユーザー名: "Xavier_Ex" パスワード: "Ilovestackoverflow"

このようなパスワードは "sfhj87s&^f" にハッシュされます。これで、レインボー テーブルは "sfhj87s&^f" とも言えます -> Ilovestackoverflow... えっと、あなたのパスワードはクラックされています。

しかし、ソルトすると、「Ilovestackoverflow」->「Io*ves5tacmkove3rflow」のようになります。これがハッシュされたとき "Io*ves5tacmkove3rflow" -> "dfgdfgdf"

"dfgdfgdf" が "Io*ves5tacmkove3rflow" を返すレインボー テーブルでは、パスワードはまだ秘密です。

つまり、そのような保護が必要でない限り、これをスキップできます。

于 2013-01-24T21:59:31.837 に答える