5

私は bcrypt を使用してソルトとハッシュ パスワードを生成していますが、それが非常に安全に行われているとは思いません。次のコードを使用すると:

bcrypt.genSalt(10, function(err, salt) {
  user.salt = salt;
  bcrypt.hash(password, salt, function(err, hash) {
    user.hashed_password = hash;
    console.log(user.salt);
    console.log(user.hashed_password);
    user.save(function(err) {
      if (err) console.log(err);
      console.log("saved");
    });
  });
});

一例では、salt は次$2a$10$mFFjRpY1Vrq7Fy1fFp0fMOのとおりです。hashed_pa​​ssword は次のとおりです。$2a$10$mFFjRpY1Vrq7Fy1fFp0fMOVnlv9cKgAFdCQ5xdtlP6UoKz90i1FMu

ハッシュされたパスワードの先頭はソルトとまったく同じです。攻撃者がソルトにアクセスできる場合、ハッシュされたパスワードからソルトを削除し、ブルート フォースまたは所定のハッシュ値のテーブルを使用してパスワードを決定することはできませんか?

私はいつも、これがパスワードをハッシュする順序であるべきだと思っていました:

hash(salt + password)

いいえ:

salt + hash(password)
4

1 に答える 1

17

パスワードを確認するためにソルトにアクセスする必要があるため、ハッシュされたパスワードの先頭はソルトです。

表示されるデータは、ハッシュ (ソルト + パスワード) でもソルト + ハッシュ (パスワード) でもありません。形式は次のとおりです。

salt + hash(salt + password)

攻撃者がこのデータにアクセスした場合:

  • もちろん、(理論的には) パスワードをブルート フォースすることはできます。これを防ぐ技術はありませんが、レート制限により攻撃は非現実的になります。このインスタンスで使用されるハッシュ関数は、実行に時間がかかるように特別に設計されており、間接的に攻撃をレート制限しています。
  • 彼らはハッシュの標準テーブルを使用してパスワードを見つけることができません。これは、ハッシュされた値にも一意のソルトが含まれているためです。もちろん、ソルトは平文で存在するため、テーブルを計算できますが、ソルトもハッシュ化された各パスワードに固有であるため、これはブルート フォース攻撃に勝るものはありません。
于 2013-07-18T07:32:36.140 に答える