9

ユーザーパスワードのハッシュを生成するためにbcryptjsを使用しようとしています。しかし、私は1つの問題で少し混乱しています。

従来、この記事によると、次のことを行う必要があります。

  • パスワード ハッシュのソルトを比較的長く一意に保ちます。
  • このソルトでソルトされたユーザーパスワードをハッシュします
  • ソルトとハッシュ化されたパスワードをソルトとともに保存します

そのため、ユーザーの認証中にハッシュを比較する場合、保存されたソルトをユーザーが入力したパスワードに追加し、それをデータベースのハッシュと比較します。

ただし、bcryptjs の hashSync とcompareSyncを次のように使用します。

//hashSync to generate hash
var bcrypt = require('bcryptjs');
var password = "abc";
var hash = bcrypt.hashSync( <some string>, < integer length of salt>) // the salt of mentioned length(4-31) is self-generated which is random and fairly unique

//compareSYnc to compare hash
var testString="abc";
console.log(bcrypt.compareSync(testString, hash)) // compares with previously generated hash returns "true" in this case.

私が混乱しているのは、認証中にソルトが必要ない場合、ソルトを生成する意味は何ですか? compareSync はtrue、ソルトにアクセスせずに戻ります。では、比較的小さなパスワードに対するブルートフォース攻撃が容易になるのではないでしょうか? 以下はすべて、salt のサイズに関係なく true を返します。

console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc"))); // consoles true. by default, if salt size is not mentioned, size is 10.
console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc", 4))); //consoles true
console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc", 8))); //consoles true
console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc", 32))); //consoles true
console.log(bcrypt.compareSync("ab", bcrypt.hashSync("abc", 4))); //consoles false

私の混乱を説明するのに十分明確であることを願っています。

4

1 に答える 1