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">// 생성 a12비트에 대한 임의의 비밀번호</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
위의 코드는 숫자, 상단 및 소문자가 포함 된 문자 세트로 $ 문자를 설정 한 다음 rand ()를 사용하여 무작위로 문자를 선택하고 마지막으로 지정된 길이의 비밀번호를 생성합니다. RAND ()를 사용하는 장점은 구현이 간단하고 단기 응용 프로그램의 경우 기본 임의 암호 생성 요구를 충족시킬 수 있다는 것입니다.
RAND () 기능은 임의의 암호를 생성 할 때 매우 편리하지만 보안 요구 사항이 높은 시나리오에는 적합하지 않습니다. 단점은 주로 다음 측면에서 반영됩니다.
충분히 무작위가 아닙니다 : Rand () 에 의해 생성 된 숫자는 완전히 무작위가 아니라 의사 랜덤입니다. 종자 값을 기준으로 하며이 종자 값이 충분히 무작위가 아닌 경우 생성 된 암호는 쉽게 예측됩니다.
높은 예측 가능성 : 적절한 종자 값이 없으면 Rand () 에 의해 생성 된 랜덤 숫자 시퀀스를 되돌릴 수 있습니다. 특히 서버가 다시 시작된 후 종자 값이 재 구선 될 수있어 공격자가 생성 된 암호를 쉽게 추측 할 수 있습니다.
비밀번호 보안을 향상 시키려면 RAND () 기능을 사용할 때 무작위성을 향상시켜야합니다. 몇 가지 일반적인 방법은 다음과 같습니다.
PHP는 random_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">// 생성 a12비트를위한 안전한 임의 암호</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
random_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 자 이상이며 암호가 길수록 무차별대로가 더 어려워집니다. 또한 암호에 문자가 많을수록 암호의 강도가 높아집니다.