現在の位置: ホーム> 最新記事一覧> hash_pbkdf2関数を使用してキーを生成した後、安全なストレージを確保する方法は?

hash_pbkdf2関数を使用してキーを生成した後、安全なストレージを確保する方法は?

gitbox 2025-07-02

1. Hash_pbkdf2関数を理解します

HASH_PBKDF2は、パスワードベースのハッシュ関数(PBKDF2)を使用してキーを生成するためにPHPによって提供される関数です。 PBKDF2は、複数のハッシュおよび塩漬け技術を通じてセキュリティを強化するアルゴリズムであり、ブルートフォースの亀裂と辞書攻撃を効果的に防ぐことができます。

 <span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_pbkdf2</span></span><span>(</span><span><span class="hljs-string">"sha256"</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>, </span><span><span class="hljs-variable">$iterations</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span></span>

パラメーター分析:

  • 「SHA256」 :ここでSHA-256を使用して、選択したハッシュアルゴリズムが選択されています。

  • $パスワード:ユーザーが入力したパスワード。

  • $塩:暗号化セキュリティを増やすために、ランダムに生成された塩値。

  • $ iterations :ハッシュイテレーションの数。反復数が多いほど、割れが難しくなります。

  • $の長さ:生成されたキーの長さ。

  • false :通常はfalseに設定されたバイナリ結果を出力するかどうかは、16進文字列を出力します。

PBKDF2のセキュリティは、塩値と反復数に依存します。これらのパラメーターを合理的に設定すると、キーストレージのセキュリティを大幅に改善できます。


2。生成されたキーを安全に保存します

2.1安全性を高めるために、塩と複数の反復を使用します

キーを生成するときは、まずランダムに生成された塩値( $塩)を使用するようにする必要があります。塩値の機能は、同じキーを生成するのと同じパスワードを回避し、ブルートフォース亀裂の難しさをさらに高めることです。通常、塩値の長さは、ランダム性を確保するために少なくとも16バイトであるように推奨されます。

また、 hash_pbkdf2で十分な反復を設定することも重要です。理論的には、繰り返しが多いほど、繰り返しが長いほど、キーを生成するのに時間がかかり、それを割るのが難しくなります。推奨される反復数は少なくとも100,000倍です。このようにして、攻撃者はキーをブルートフォースするために、より多くの時間と計算リソースを必要とします。

 <span><span><span class="hljs-variable">$salt</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bin2hex</span></span><span>(</span><span><span class="hljs-title function_ invoke__">random_bytes</span></span><span>(</span><span><span class="hljs-number">16</span></span><span>)); </span><span><span class="hljs-comment">// 生成する16バイトのランダム塩値</span></span><span>
</span><span><span class="hljs-variable">$iterations</span></span><span> = </span><span><span class="hljs-number">100000</span></span><span>; </span><span><span class="hljs-comment">// 少なくとも100,000この反復</span></span><span>
</span><span><span class="hljs-variable">$key</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_pbkdf2</span></span><span>(</span><span><span class="hljs-string">"sha256"</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>, </span><span><span class="hljs-variable">$iterations</span></span><span>, </span><span><span class="hljs-number">64</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>); </span><span><span class="hljs-comment">// 64バイトキー</span></span><span>
</span></span>

2.2元のパスワードは保存されていません

ユーザーの元のパスワードを直接保存することは非常に不安です。 PHPでは、元のパスワード文字列ではなく、キーのハッシュ値を常に保存する必要があります。 hash_pbkdf2によって生成されたキーは何度も暗号化および処理されており、理論的には元のパスワードを回復することはできません。

たとえば、生成されたキー値はデータベースに保存し、ユーザーからの他の情報で保存できます。

 <span><span><span class="hljs-comment">// キーハッシュと塩の値をデータベースに保存します</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO users (username, password_hash, salt) VALUES (?, ?, ?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>]);
</span></span>

2.3独立した暗号化されたストレージを使用します

キーのセキュリティをさらに強化するために、より強力な暗号化アルゴリズムを考慮して、保存されたキーを暗号化することができます。たとえば、生成されたキーは、AEなどの対称暗号化アルゴリズムを使用して暗号化および保存できます。この場合、キーストレージは、PBKDF2によって生成されるハッシュだけでなく、追加の暗号化層にも依存しています。

 <span><span><span class="hljs-variable">$encryption_key</span></span><span> = </span><span><span class="hljs-string">'your-secure-encryption-key'</span></span><span>;
</span><span><span class="hljs-variable">$encrypted_key</span></span><span> = </span><span><span class="hljs-title function_ invoke__">openssl_encrypt</span></span><span>(</span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-string">'AES-256-CBC'</span></span><span>, </span><span><span class="hljs-variable">$encryption_key</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$iv</span></span><span>);
</span></span>

キーを暗号化するときは、暗号化キー( $ necryption_key )の安全なストレージを確認する必要があることに注意してください。暗号化キー自体は、ハードウェアセキュリティモジュール(HSM)やキー管理サービスなど、非常に安全な場所に保存する必要があります。


3.パスワードの漏れを防ぎます

3.1データベースセキュリティ

キー自体を保護することに加えて、データベース全体のセキュリティも重要です。データベースアクセスが厳密に制御されていることを確認し、SSL/TLSなどの強力なパスワードと暗号化された接続を使用して、中間の攻撃やデータ侵害を防ぎます。

データベースは最小許可の原則を採用する必要があり、認定されたユーザーのみが機密データにアクセスできます。

3.2定期的にキー値と塩値を更新します

長期的なセキュリティを改善するために、キーと塩の値の定期的な更新も効果的なセキュリティ尺度です。キーの更新は単純ではありませんが、塩値を定期的に再ハッシュでき、塩値を置き換えることができれば、漏れのリスクを防ぐことができます。

たとえば、ユーザーがログインした後、ユーザーはパスワードを定期的に変更し、新しい塩値とキーでストレージを再暗号化するように求められます。

3.3 SQL注入およびブルートフォース攻撃を防ぎます

SQL注入攻撃の防止は、キーの安全な保存を確保するための基本的なステップです。データベースクエリでのユーザー入力が完全に逃げられていることを確認するか、前処理ステートメントを使用してSQL注入の脆弱性を避けてください。

ブルートフォースクラッキング攻撃の場合、ログインの試みの数を制限し、検証コードメカニズムを導入し、疑わしいログイン動作を監視することにより、リスクを減らすことができます。