rand()は、指定された範囲でランダムな整数を生成するPHPに組み込まれた関数です。パスワードを生成するとき、 rand()関数を絶えず呼び出して、最終的に完全なパスワードを形成することにより、複数のランダム文字を生成できます。 rand()関数を使用して、単純なランダムパスワードを生成する方法は次のとおりです。
<span><span><span class="hljs-meta"><?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> < </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">?></span></span><span>
</span></span>
上記のコードは、数字、上品および小文字の文字を含む文字セットを備えた$文字を設定し、 Rand()を使用して文字をランダムに選択し、最終的に指定された長さのパスワードを生成します。 Rand()を使用する利点は、実装が簡単であり、短期アプリケーションの場合、基本的なランダムパスワード生成のニーズを満たすことができることです。
ランダムパスワードを生成する場合、 RAND()関数は非常に便利ですが、セキュリティ要件が高いシナリオには適していません。欠点は、主に次の側面に反映されています。
ランダムではありません: rand()によって生成された数は完全にランダムではなく、擬似ランダムです。これはシード値に基づいており、このシード値が十分にランダムでない場合、生成されたパスワードは簡単に予測されます。
高い予測可能性:適切な種子値がない場合、特にサーバーが再起動した後、 Rand()によって生成される乱数シーケンスを逆転させることができます。シード値は再活性化され、生成されたパスワードを攻撃者が推測しやすくします。
パスワードのセキュリティを改善するには、 RAND()関数を使用するときにランダム性を向上させる必要があります。ここにいくつかの一般的な方法があります:
PHPは、 RANDAM_INT()やRANDOM_BYTES()など、 RAND()よりも安全な乱数生成関数を提供します。
random_int() :これは、整数の生成に適した暗号化された安全な乱数ジェネレーターです。 Rand()よりも安全で、パスワードなどのセキュリティ要件が高いシナリオに適しています。
<span><span><span class="hljs-meta"><?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> < </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">?></span></span><span>
</span></span>
RANDAME_BYTES() :パスワードの文字の代わりにバイトを生成する必要がある場合は、パスワードの印刷可能な文字に変換できる安全なバイナリ文字列を返すRANDOM_BYTES()を使用できます。
<span><span><span class="hljs-meta"><?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">?></span></span><span>
</span></span>
パスワードの強度を高めるために、文字セットの複雑さを増やし、より多くのシンボル、特殊文字などを追加できます。これにより、パスワードの組み合わせの数が大幅に増加し、ブルートフォースの割れがより困難になります。
<span><span><span class="hljs-meta"><?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!@#$%^&*()_-+=<>?'</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> < </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">?></span></span><span>
</span></span>
パスワードの長さは、パスワードの強度の重要な要素です。通常、パスワードの長さは少なくとも12文字であり、パスワードが長くなればなるほど、ブルート強化を難しくすることをお勧めします。さらに、パスワードに文字が多いほど、パスワードの強度が高くなります。