私はWebアプリを作成していますが、パスワードの保存にsha256の100,000回の反復を使用するのが安全かどうか疑問に思っていましたか?私はscryptやbcryptなどのアルゴリズムがあることを知っていますが、パスワードの保存にsha256の100,000回の反復を使用することが可能かどうか疑問に思っていました。
私は完全な初心者であり、助けていただければ幸いです。
タイトルに答えるには:いいえ。
あなたの質問の前提はそもそも正しくありません。 SHA256の反復を繰り返すことは、パスワードの保存に適したアルゴリズムではありません。
使用可能なバインディングが言語にある場合は、 Argon2 を使用する必要があります。 PHPを使用している場合は、組み込みの password_hash 関数をPASSWORD_ARGON2I
国旗。 .NETアプリケーションの場合、 フルマネージド実装が利用可能 があります。 Java でも使用できるバインディングがあります。 Paragonによる パスワードを安全に保管する に関する素晴らしい記事があります。これには、さまざまな言語のサンプルコードが含まれています。
Argon2を絶対に使用できない場合、使用できなかった理由はわかりません(現在、ほぼすべての言語にバインドがあります!)繰り返しになりますが、ほとんどすべての言語にこれらのバインディングまたはライブラリがあります。
質問を2つの要素に分けましょう。
場合によります!システムが合理的な応答で処理できる反復回数/作業係数を常に使用する必要があります。サイドはシングルスレッド(提供された1つのパスワードをハッシュ)であり、攻撃者は並列(多数の可能なパスワードを同時に試行)であることを理解します。 )。
したがって、各ハッシュに費やすことができる時間を決定します。ルールがハッシュにかかる時間は1/10秒以下で、8コアボックスで1秒あたり16回のログインが予想される場合、ハッシュの反復回数/作業係数は1/20秒かかるはずです。
単独ではありません。塩を含む構造の一部として、はい、絶対に。 SHA-256を使用する、探している構成はPBKDF2-HMAC-SHA-256です。これは、HMAC-SHA-256の反復を使用します。これは、単純に HASH(Key XOR = opad、HASH(Key XOR ipad、text)) ここで、ipadとopadは固定値です(SHA-256のサイズ)。
PBKDF2(RFC2898) それらを次のように反復します。
U_1 = PRF (P, S || INT (i)) ,
U_2 = PRF (P, U_1) ,
...
U_c = PRF (P, U_{c-1}) .
HMACコンストラクトはPRFであることに注意することが重要です。
私のGithubリポジトリでさまざまなPBKDF2実装 を見つけることができます。これには、さまざまな言語やゼロからの実装、OpenSSLやPolarSSL、およびテストベクタを含むその他のライブラリベースの実装が含まれます。
あなたが書いたものと利用可能な他のものの速度を比較してください-安全なパスワードハッシュのためには、あなたはあなたの最速の実装を使わなければなりません