web-dev-qa-db-ja.com

bcryptは塩を保存する必要はありませんか?

私はbcryptと混同しています。saltを保存し、プレーンテキストのパスワード+ saltをハッシュされたパスワードと比較する必要があると思いますが、ドキュメントからは、saltを保存する必要はまったくないようです。実際、私はこのコードを使用して、saltおよびハッシュされたパスワードを作成しました。

  let salt = await bcrypt.genSalt(10);

  const saltpasshash = await new Promise((resolve, reject) => {
    bcrypt.hash(plain_text_password, salt, function(err, hash) {
      if (err) reject(err)
      resolve(hash)
    });
  })

  //NOTE I SAVE saltpasshash as users pass and the salt in a separate field in the users table.

これは機能しますが、私が混乱しているのは、次のように比較すると有効な結果が返されることです。

valid = await bcrypt.compare(plain_text_password, user.saltpasshash);

私がソルトを提供していないのになぜこれが有効であるのか、そしてもしそうなら、なぜソルトをまったく保存するのかについて混乱しています。

15
edencorbin

Wikipediaのbcryptの説明 から:

...残りのハッシュ文字列includesコストパラメータ128ビットソルト(22文字としてエンコードされたRadix-64)、および結果のハッシュ値の184ビット(31文字としてエンコードされたRadix-64)

したがって、ソルトは出力文字列に自動的に含まれます。つまり、自分で追加する必要はありません。

16
Steffen Ullrich