php에서 임의 암호 생성

php에서 랜덤 패스워드를 생성하려고 합니다.

단, 저는 ‘a’를 모두 받고 있으며, 반환 타입은 배열 타입이므로 문자열로 해 주셨으면 합니다.코드를 수정하는 방법에 대한 아이디어 있나요?

고마워요.

function randomPassword() {
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
for ($i = 0; $i < 8; $i++) {
$n = rand(0, count($alphabet)-1);
$pass[$i] = $alphabet[$n];
}
return $pass; } 


질문에 대한 답변



보안 경고:rand()는 암호화로 보호된 의사 난수 생성기가 아닙니다.다른 곳에서 암호화로 보호된 의사 난수 문자열을 PHP에서 생성합니다.

이것을 사용해 보세요(사용).strlen대신count,왜냐면count끈에 매달리면 항상1):

function randomPassword() {
$alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
$pass = array(); //remember to declare $pass as an array
$alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
for ($i = 0; $i < 8; $i++) {
$n = rand(0, $alphaLength);
$pass[] = $alphabet[$n];
}
return implode($pass); //turn the array into a string } 

데모




TL;DR:

  • 사용하다random_int()기정사실random_str()아래.
  • 없으면random_int()random_compat을 사용합니다.

설명:

패스워드를 생성하고 있기 때문에 생성하는 패스워드가 예측 불가능한 것을 확인해야 합니다.또한 이 속성이 실장 내에 존재하는지 확인하는 유일한 방법은 암호학적으로 안전한 Pseudorandom Number Generator(CSPRNG)를 사용하는 것입니다.

CSPRNG의 요건은 랜덤 문자열의 일반적인 경우 완화될 수 있지만 보안이 관련된 경우에는 완화되지 않습니다.

PHP의 패스워드 생성에 대한 간단하고 안전하며 정답은 RandomLib을 사용하는 것이며 휠을 재창조하지 않는 것입니다.이 라이브러리는 저뿐만 아니라 업계 보안 전문가들에 의해서도 감사를 받았습니다.

독자적인 솔루션의 발명을 희망하는 개발자를 위해서, PHP 7.0.0은 이러한 목적을 제공합니다.아직 PHP 5.x를 사용하고 있다면 PHP 7이 출시되기 전에 새로운 API를 사용할 수 있도록 PHP 5 polyfill을 작성했습니다.사용방법random_int()polyfill은 아마 자신의 구현을 작성하는 것보다 안전할 것입니다.

안전한 랜덤 정수 생성기를 사용하면 안전한 랜덤 문자열을 생성하는 것이 파이보다 쉽습니다.

<?php /**
* Generate a random string, using a cryptographically secure
* pseudorandom number generator (random_int)
*
* For PHP 7, random_int is a PHP core function
* For PHP 5.x, depends on https://github.com/paragonie/random_compat
*
* @param int $length
How many characters do we want?
* @param string $keyspace A string of all possible characters
*

 to select from
* @return string
*/ function random_str(
$length,
$keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ) {
$str = '';
$max = mb_strlen($keyspace, '8bit') - 1;
if ($max < 1) {
throw new Exception('$keyspace must be at least two characters long');
}
for ($i = 0; $i < $length; ++$i) {
$str .= $keyspace[random_int(0, $max)];
}
return $str; } 



특정 방법으로 비밀번호를 생성하려고 하는 것은 알고 있습니다만, 이 메서드도 검토해 보시기 바랍니다.

$bytes = openssl_random_pseudo_bytes(2);
$pwd = bin2hex($bytes); 

이것은 php.net 사이트에서 가져온 것으로, openssl_display_bytes 함수에 입력한 숫자의 2배 길이의 문자열을 만듭니다.따라서 위의 암호는 4자 길이의 암호를 생성합니다.

한마디로…

$pwd = bin2hex(openssl_random_pseudo_bytes(4)); 

8자 길이의 암호를 만듭니다.

단, 비밀번호는 0~9의 숫자와 a~f의 작은 대문자로만 구성되어 있습니다.




두 줄의 작은 코드.

데모: http://codepad.org/5rHMHwnH

function rand_string( $length ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
return substr(str_shuffle($chars),0,$length);
}
echo rand_string(8); 

rand_string을 사용하여 작성되는 문자량을 정의할 수 있습니다.




PHP7을 사용하는 경우 다음 기능을 사용할 수 있습니다.

function generate_password($length = 20){
$chars =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.
 '0123456789`-=~!@#$%^&*()_+,./<>?;:[]{} ';
$str = '';
$max = strlen($chars) - 1;
for ($i=0; $i < $length; $i++)
$str .= $chars[random_int(0, $max)];
return $str; } 

아래 오래된 답변:

function generate_password($length = 20){
$chars =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.
 '0123456789`-=~!@#$%^&*()_+,./<>?;:[]{} ';
$str = '';
$max = strlen($chars) - 1;
for ($i=0; $i < $length; $i++)
$str .= $chars[mt_rand(0, $max)];
return $str; }