現在の位置: ホーム> 最新記事一覧> rand()関数を使用してランダムなパスワードを生成する方法は何ですか?パスワードセキュリティを改善する方法は?

rand()関数を使用してランダムなパスワードを生成する方法は何ですか?パスワードセキュリティを改善する方法は?

gitbox 2025-07-27

1。RAND()関数はランダムなパスワードを生成します

rand()は、指定された範囲でランダムな整数を生成するPHPに組み込まれた関数です。パスワードを生成するとき、 rand()関数を絶えず呼び出して、最終的に完全なパスワードを形成することにより、複数のランダム文字を生成できます。 rand()関数を使用して、単純なランダムパスワードを生成する方法は次のとおりです。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">generateRandomPassword</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$length</span></span></span><span> = </span><span><span class="hljs-number">8</span></span><span>) {
    </span><span><span class="hljs-variable">$characters</span></span><span> = </span><span><span class="hljs-string">'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'</span></span><span>;
    </span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
    
    </span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> &lt; </span><span><span class="hljs-variable">$length</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
        </span><span><span class="hljs-variable">$randomIndex</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rand</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$characters</span></span><span>) - </span><span><span class="hljs-number">1</span></span><span>); </span><span><span class="hljs-comment">// ランダムインデックスを生成するします</span></span><span>
        </span><span><span class="hljs-variable">$password</span></span><span> .= </span><span><span class="hljs-variable">$characters</span></span><span>[</span><span><span class="hljs-variable">$randomIndex</span></span><span>]; </span><span><span class="hljs-comment">// ランダム文字をパスワード文字列に添付します</span></span><span>
    }

    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$password</span></span><span>;
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">generateRandomPassword</span></span><span>(</span><span><span class="hljs-number">12</span></span><span>); </span><span><span class="hljs-comment">// aを生成するします12ビットのランダムパスワード</span></span><span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

上記のコードは、数字、上品および小文字の文字を含む文字セットを備えた$文字を設定し、 Rand()を使用して文字をランダムに選択し、最終的に指定された長さのパスワードを生成します。 Rand()を使用する利点は、実装が簡単であり、短期アプリケーションの場合、基本的なランダムパスワード生成のニーズを満たすことができることです。


2。rand()の欠点

ランダムパスワードを生成する場合、 RAND()関数は非常に便利ですが、セキュリティ要件が高いシナリオには適していません。欠点は、主に次の側面に反映されています。

  • ランダムではありませんrand()によって生成された数は完全にランダムではなく、擬似ランダムです。これはシード値に基づいており、このシード値が十分にランダムでない場合、生成されたパスワードは簡単に予測されます。

  • 高い予測可能性:適切な種子値がない場合、特にサーバーが再起動した後、 Rand()によって生成される乱数シーケンスを逆転させることができます。シード値は再活性化され、生成されたパスワードを攻撃者が推測しやすくします。


3.パスワードセキュリティを改善する方法

パスワードのセキュリティを改善するには、 RAND()関数を使用するときにランダム性を向上させる必要があります。ここにいくつかの一般的な方法があります:

3.1より強い乱数ジェネレーターを使用: random_int()およびrandom_bytes()

PHPは、 RANDAM_INT()RANDOM_BYTES()など、 RAND()よりも安全な乱数生成関数を提供します。

  • random_int() :これは、整数の生成に適した暗号化された安全な乱数ジェネレーターです。 Rand()よりも安全で、パスワードなどのセキュリティ要件が高いシナリオに適しています。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">generateSecureRandomPassword</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$length</span></span></span><span> = </span><span><span class="hljs-number">8</span></span><span>) {
    </span><span><span class="hljs-variable">$characters</span></span><span> = </span><span><span class="hljs-string">'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'</span></span><span>;
    </span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
    
    </span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> &lt; </span><span><span class="hljs-variable">$length</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
        </span><span><span class="hljs-variable">$randomIndex</span></span><span> = </span><span><span class="hljs-title function_ invoke__">random_int</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$characters</span></span><span>) - </span><span><span class="hljs-number">1</span></span><span>); </span><span><span class="hljs-comment">// 使用 random_int より安全なランダムインデックスを生成するします</span></span><span>
        </span><span><span class="hljs-variable">$password</span></span><span> .= </span><span><span class="hljs-variable">$characters</span></span><span>[</span><span><span class="hljs-variable">$randomIndex</span></span><span>];
    }

    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$password</span></span><span>;
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">generateSecureRandomPassword</span></span><span>(</span><span><span class="hljs-number">12</span></span><span>); </span><span><span class="hljs-comment">// aを生成するします12ビットのより安全なランダムパスワード</span></span><span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>
  • RANDAME_BYTES() :パスワードの文字の代わりにバイトを生成する必要がある場合は、パスワードの印刷可能な文字に変換できる安全なバイナリ文字列を返すRANDOM_BYTES()を使用できます。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">generateRandomPasswordFromBytes</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$length</span></span></span><span> = </span><span><span class="hljs-number">8</span></span><span>) {
    </span><span><span class="hljs-variable">$bytes</span></span><span> = </span><span><span class="hljs-title function_ invoke__">random_bytes</span></span><span>(</span><span><span class="hljs-variable">$length</span></span><span>);
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">bin2hex</span></span><span>(</span><span><span class="hljs-variable">$bytes</span></span><span>); </span><span><span class="hljs-comment">// バイトを16進の文字列に変換します</span></span><span>
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">generateRandomPasswordFromBytes</span></span><span>(</span><span><span class="hljs-number">8</span></span><span>); </span><span><span class="hljs-comment">// 生成する81つのバイトのランダムパスワード</span></span><span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

3.2より複雑な文字セットの使用

パスワードの強度を高めるために、文字セットの複雑さを増やし、より多くのシンボル、特殊文字などを追加できます。これにより、パスワードの組み合わせの数が大幅に増加し、ブルートフォースの割れがより困難になります。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">generateComplexRandomPassword</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$length</span></span></span><span> = </span><span><span class="hljs-number">12</span></span><span>) {
    </span><span><span class="hljs-variable">$characters</span></span><span> = </span><span><span class="hljs-string">'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&amp;*()_-+=&lt;&gt;?'</span></span><span>;
    </span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
    
    </span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> &lt; </span><span><span class="hljs-variable">$length</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
        </span><span><span class="hljs-variable">$randomIndex</span></span><span> = </span><span><span class="hljs-title function_ invoke__">random_int</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$characters</span></span><span>) - </span><span><span class="hljs-number">1</span></span><span>); </span><span><span class="hljs-comment">// より複雑な文字セットを使用します</span></span><span>
        </span><span><span class="hljs-variable">$password</span></span><span> .= </span><span><span class="hljs-variable">$characters</span></span><span>[</span><span><span class="hljs-variable">$randomIndex</span></span><span>];
    }

    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$password</span></span><span>;
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">generateComplexRandomPassword</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-meta">?&gt;</span></span><span>
</span></span>

3.3適切なパスワードの長さを設定します

パスワードの長さは、パスワードの強度の重要な要素です。通常、パスワードの長さは少なくとも12文字であり、パスワードが長くなればなるほど、ブルート強化を難しくすることをお勧めします。さらに、パスワードに文字が多いほど、パスワードの強度が高くなります。