web-dev-qa-db-ja.com

エントロピー資格が高い場合、SHA256ハッシュで十分ですか?

クライアントがAPIキーとして使用する高エントロピー認証情報(256ビットのランダムな値など)のデータベースを持っているとしましょう。データベースの侵害によって攻撃者が盗んだ認証情報で私のAPIにアクセスできないように、データベースでそれらをハッシュ化したいと思います。

さて、私が高いエントロピー値(短いか「パスワード」を推測するのは簡単ではない)を保証したとすると、bcryptのようなものに本当に利点があるのでしょうか?無塩SHA256でも同様に効果的に実行できますか?

4
Bosh

@NeilSmithlineの優れた回答に加えて、いくつかの点を指摘したいと思います。

256ビットのランダムな値を取り、それをSHA-256でハッシュしても、出力には(ほぼ)256ビットのエントロピーが残ります。 SHA256が実際に256ビットのすべての可能な文字列にマップするかどうかは未解決の問題なので、「大まかに」言いますが、実際には、これで十分です。

Bcrypt:bcryptの利点は、攻撃者が推測ごとにハッシュを何回も実行する必要があることです。これにより、攻撃が遅くなり、電力コストが上昇します。 。

ブルートフォーシング:ある愚か者がSHA256で256ビットのランダム文字列をブルートフォーシングしてみたかったとしましょう。平均して2を作成する必要があります255 推測。それぞれの推測に1ナノ秒かかり、1電子分のエネルギーを消費すると仮定すると、 1060 (これは1050 * ageOfUniverse)および 9,000天の川銀河 に相当するエネルギーを消費するパワープラントが必要になります。 2256 大きな数字です。

結論:ええ、無塩SHA256を実行した256ビットのランダムな値を総当たりにするつもりはありません。追加する理由はありません。 bcryptの形式での追加の計算。セキュリティについて考え、良い質問をするのにいいです:-)

(実際には、弱リンクはハッシュではなく乱数ジェネレーターです。攻撃者がこれらの乱数値を生成したRNGの可能なシードのリストを絞り込むことができる場合、辞書攻撃が可能になる可能性があります。その場合、bcryptはいくつかの便利な減速を追加します。)

3
Mike Ounsworth

はい。ソルトは事前計算攻撃を防ぐために使用されますが、ランダムな256ビット文字列は事前計算には大きすぎます。反復回数が多い低速ハッシュ関数は、辞書攻撃の速度を落とすことを目的としていますが、ランダムな256ビット文字列は、辞書や完全なテストには大きすぎます。したがって、単一のSHA256ハッシュは、長く暗号化された安全なランダム入力に対して安全です。

4
Neil Smithline