나는이 같은 문제를 해결하는 방법을 찾고 있었지만 암호 검색에도 사용할 수있는 토큰을 만드는 기능을 원합니다. 이것은 토큰의 추측 능력을 제한해야 함을 의미합니다. 때문에 uniqid
시간에 따라, 그리고 php.net에 따라하고있다 "반환 값은 () microtime에서 약간 다릅니다은" uniqid
기준을 충족하지 않습니다. PHP openssl_random_pseudo_bytes()
는 암호로 안전한 토큰을 생성하기 위해 대신 사용 하는 것이 좋습니다 .
짧고 간결한 대답은 다음과 같습니다.
bin2hex(openssl_random_pseudo_bytes($bytes))
길이 = $ bytes * 2의 임의의 영숫자 문자열을 생성합니다. 불행히도 이것은 알파벳 만 [a-f][0-9]
있지만 작동합니다.
아래는 기준을 만족시킬 수있는 가장 강력한 기능입니다 (이것은 Erik의 답변의 구현 버전입니다).
function crypto_rand_secure($min, $max)
{
$range = $max - $min;
if ($range < 1) return $min; // not so random...
$log = ceil(log($range, 2));
$bytes = (int) ($log / 8) + 1; // length in bytes
$bits = (int) $log + 1; // length in bits
$filter = (int) (1 << $bits) - 1; // set all lower bits to 1
do {
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
$rnd = $rnd & $filter; // discard irrelevant bits
} while ($rnd > $range);
return $min + $rnd;
}
function getToken($length)
{
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
$max = strlen($codeAlphabet); // edited
for ($i=0; $i < $length; $i++) {
$token .= $codeAlphabet[crypto_rand_secure(0, $max-1)];
}
return $token;
}
crypto_rand_secure($min, $max)
rand()
또는의 대체품으로 사용됩니다 mt_rand
. openssl_random_pseudo_bytes를 사용하여 $ min과 $ max 사이의 난수를 만드는 데 도움이됩니다.
getToken($length)
토큰 내에서 사용할 알파벳을 만든 다음 length 문자열을 만듭니다 $length
.
편집 : 나는 소스 인용을 소홀히했다-http : //us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
편집 (PHP7) : PHP7 의 출시와 함께 표준 라이브러리에는 위의 crypto_rand_secure 함수를 대체 / 개선 / 단순화 할 수있는 두 가지 새로운 기능이 있습니다. random_bytes($length)
과random_int($min, $max)
http://php.net/manual/en/function.random-bytes.php
http://php.net/manual/en/function.random-int.php
예:
function getToken($length){
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
$max = strlen($codeAlphabet);
for ($i=0; $i < $length; $i++) {
$token .= $codeAlphabet[random_int(0, $max-1)];
}
return $token;
}