programing

PHP 랜덤 문자열 생성기

randomtip 2022. 12. 21. 22:58
반응형

PHP 랜덤 문자열 생성기

PHP에서 랜덤화 문자열을 생성하려고 하는데, 이 문자열로 인해 출력이 전혀 표시되지 않습니다.

<?php
    function RandomString()
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randstring = '';
        for ($i = 0; $i < 10; $i++) {
            $randstring = $characters[rand(0, strlen($characters))];
        }
        return $randstring;
    }

    RandomString();
    echo $randstring;

내가 뭘 잘못하고 있지?

이 질문에 구체적으로 대답하려면 다음 두 가지 문제가 있습니다.

  1. $randstring에코할 때는 범위를 벗어납니다.
  2. 문자는 루프 내에서 서로 연결되어 있지 않습니다.

다음은 수정된 코드 조각입니다.

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

다음 콜에서 랜덤 문자열을 출력합니다.

// Echo the random string.
// Optionally, you can give it a desired string length.
echo generateRandomString();

이렇게 하면 예측 가능한 랜덤 문자열이 생성됩니다.시큐어 토큰을 작성하는 경우는, 다음의 회답을 참조해 주세요.

★★★★★★str_shuffle()는 내부적으로 를 사용하고 있습니다.이는 암호화 목적(랜덤패스워드 생성 등)에는 적합하지 않습니다.대신 안전한 난수 생성기가 필요합니다.또한 캐릭터의 반복도 허용하지 않습니다.

한 가지 더.

갱신했다 (이것으로 임의의 길이의 문자열이 생성됩니다).

function generateRandomString($length = 10) {
    return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}

echo  generateRandomString();  // OR: generateRandomString(24)

이상입니다. :)

이 질문에는 많은 답변이 있습니다만, 어느 것도 Cryptographically Secure Pseudo-Random Number Generator(CSPRNG)를 이용하지 않습니다.

간단하고 안전하며 올바른 답은 Random Lib을 사용하는 것입니다. 수고를 들이지 마십시오.

독자적으로 솔루션을 개발하기를 고집하는 분들을 위해 PHP 7.0.0이 이 목적을 위해 준비되어 있습니다. 만약 당신이 여전히 PHP 5.x에 있다면, 우리는 PHP 7로 업그레이드하기 전에 새로운 API를 사용할 수 있도록 PHP 5 polyfill을 작성했습니다.

PHP에서 랜덤 정수를 안전하게 생성하는 것은 간단한 작업이 아닙니다.실가동 환경에 자체 개발한 알고리즘을 도입하기 전에 항상 상주하는 StackExchange 암호화 전문가에게 확인해야 합니다.

안전한 정수 생성기가 설치되어 있으면 CSPRNG를 사용하여 랜덤 문자열을 생성하는 것은 쉬운 일입니다.

시큐어 랜덤 문자열

/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 *
 * This function uses type hints now (PHP 7+ only), but it was originally
 * written for PHP 5 as well.
 * 
 * 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(
    int $length = 64,
    string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
): string {
    if ($length < 1) {
        throw new \RangeException("Length must be a positive integer");
    }
    $pieces = [];
    $max = mb_strlen($keyspace, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pieces []= $keyspace[random_int(0, $max)];
    }
    return implode('', $pieces);
}

사용방법:

$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
$c = random_str();

데모: https://3v4l.org/IMJGF (PHP 5 장애는 무시하십시오.random_compat이 필요합니다)

그러면 20자 길이의 16진수 문자열이 생성됩니다.

$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars

PHP 7(random_bytes()):

$string = base64_encode(random_bytes(10)); // ~14 characters, includes /=+
// or
$string = substr(str_replace(['+', '/', '='], '', base64_encode(random_bytes(32))), 0, 32); // 32 characters, without /=+
// or
$string = bin2hex(random_bytes(10)); // 20 characters, only 0-9a-f

@hargiski: 당신의 답변은 나에게 효과가 있었다.나도 같은 문제가 있었고, 항상 같은 답을 찾는 사람들에게 그것을 제안하고 싶다.다음은 @tasmaniski에서 온 것입니다.

<?php 
    $random = substr(md5(mt_rand()), 0, 7);
    echo $random;
?>

여기 랜덤 번호를 만드는 방법을 보여주는 유튜브 영상이 있습니다.

어플리케이션(패스워드를 생성하려고 했습니다)에 따라서는

$string = base64_encode(openssl_random_pseudo_bytes(30));

base64를 할 수 있습니다.= ★★★★★★★★★★★★★★★★★」-그리고 요청된 캐릭터도 있습니다.더 긴 문자열을 생성한 다음 필터링 및 트리밍하여 제거할 수 있습니다.

openssl_random_pseudo_bytes 난수를 생성하는 방법은 phpsnowledge에서 인 것 . ★★★★rand 않다/dev/random★★★★★★ 。

PHP 7+ random_bytes 함수를 사용하여 암호화된 보안 랜덤 바이트를 생성합니다.

$bytes = random_bytes(16);
echo bin2hex($bytes);

출력 가능

da821217e61e33ed4b2d96f8439056c


PHP 5.3+ openssl_random_pseudo_bytes 함수를 사용하여 의사 랜덤 바이트를 생성합니다.

$bytes = openssl_random_pseudo_bytes(16);
echo bin2hex($bytes);

출력 가능

e2d1254506fbb6cd842cd333214ad


최적의 사용 사례는 다음과 같습니다.

function getRandomBytes($length = 16)
{
    if (function_exists('random_bytes')) {
        $bytes = random_bytes($length / 2);
    } else {
        $bytes = openssl_random_pseudo_bytes($length / 2);
    }
    return bin2hex($bytes);
}
echo getRandomBytes();

출력 가능

ba8cc342bdf4343

여기에서는 스크립트레벨의 루프나 OpenSSL 라이브러리를 사용하지 않고 진정한 랜덤 문자열을 생성하는 심플한 원라이너를 소개합니다.

echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))), 1, 10);

매개 변수를 제거하도록 분해하려면

// Character List to Pick from
$chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

// Minimum/Maximum times to repeat character List to seed from
$chrRepeatMin = 1; // Minimum times to repeat the seed string
$chrRepeatMax = 10; // Maximum times to repeat the seed string

// Length of Random String returned
$chrRandomLength = 10;

// The ONE LINE random command with the above variables.
echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))), 1, $chrRandomLength);

이 메서드는 문자 목록을 무작위로 반복한 후 결합된 문자열을 셔플하고 지정된 문자 수를 반환합니다.

문자열의 할 수 있습니다.이 값은 반환되는 문자열의 길이를 치환합니다.$chrRandomLengthmt_rand(8, 15)(8 ~ 15 ) 。

이 기능을 구현하는 더 좋은 방법은 다음과 같습니다.

function RandomString($length) {
    $keys = array_merge(range(0,9), range('a', 'z'));

    $key = "";
    for($i=0; $i < $length; $i++) {
        $key .= $keys[mt_rand(0, count($keys) - 1)];
    }
    return $key;
}

echo RandomString(20);

mt_randPHP 7에서는 이것과 이것들에 따라 더 랜덤합니다.rand은 function의 입니다.mt_rand.

function generateRandomString($length = 15)
{
    return substr(sha1(rand()), 0, $length);
}

짠!

$randstring하다변수에 반환 값을 할당해야 합니다.

$randstring = RandomString();
echo $randstring;

또는 반환값을 직접 에코합니다.

echo RandomString();

또한 기능상 약간의 실수가 있습니다. 루프에서는 ""에 대해 를해야 합니다..=각 문자가 문자열에 추가됩니다.「」를 사용해 .=이치

$randstring .= $characters[rand(0, strlen($characters))];

먼저 사용할 알파벳을 정의합니다.

$alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$special  = '~!@#$%^&*(){}[],./?';
$alphabet = $alphanum . $special;

그런 다음 를 사용하여 적절한 랜덤 데이터를 생성합니다.

$len = 12; // length of password
$random = openssl_random_pseudo_bytes($len);

마지막으로 이 랜덤 데이터를 사용하여 암호를 만듭니다. 님의 각$random수 있습니다.chr(0)chr(255)의 나눗셈 의 나머지를 $alphabet_length알파벳 문자만 선택되도록 합니다(선택 시 랜덤성이 바이어스됩니다).

$alphabet_length = strlen($alphabet);
$password = '';
for ($i = 0; $i < $len; ++$i) {
    $password .= $alphabet[ord($random[$i]) % $alphabet_length];
}

또는 일반적으로 RandomLib 및 SecurityLib사용하는 것이 좋습니다.

use SecurityLib\Strength;

$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new Strength(Strength::MEDIUM));

$password = $generator->generateString(12, $alphabet);

저는 그곳에서 가장 인기 있는 함수의 성능을 테스트했습니다. 제 박스에 32개의 기호로 구성된 1,000,000개의 문자열을 생성하는 데 필요한 시간은 다음과 같습니다.

2.5 $s = substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,32);
1.9 $s = base64_encode(openssl_random_pseudo_bytes(24));
1.68 $s = bin2hex(openssl_random_pseudo_bytes(16));
0.63 $s = base64_encode(random_bytes(24));
0.62 $s = bin2hex(random_bytes(16));
0.37 $s = substr(md5(rand()), 0, 32);
0.37 $s = substr(md5(mt_rand()), 0, 32);

실제 시간이 얼마였는지는 중요하지 않지만, 어느 쪽이 느리고 어느 쪽이 빠르기 때문에 암호 판독성 등의 요건에 따라 선택할 수 있습니다.

32 기호보다 짧은 문자열이 필요한 경우 MD5 주변의 기판()을 추가했습니다.

즉, 문자열이 연결되어 있지 않고 덮어쓰기되어 함수의 결과는 저장되지 않았습니다.

다음은 사용하기 쉬운 랜덤 비밀번호를 생성하는 간단한 한 줄 솔루션입니다. "1" 및 "l", "O" 및 "0"과 같은 유사 문자는 제외합니다.여기 5글자이지만 물론 쉽게 변경할 수 있습니다.

$user_password = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789'),0,5);

간단한 방법..

다음은 랜덤 문자열을 생성하는 몇 가지 가장 짧은 방법입니다.

<?php
echo $my_rand_strng = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), -15); 

echo substr(md5(rand()), 0, 7);

echo str_shuffle(MD5(microtime()));
?>

한 가지 매우 빠른 방법은 다음과 같은 작업을 수행하는 것입니다.

substr(md5(rand()),0,10);

그러면 길이가 10자인 임의의 문자열이 생성됩니다.물론 컴퓨팅 측면에서 좀 더 무겁다고 할 수도 있지만, 오늘날 프로세서는 md5 또는 sha256 알고리즘을 매우 빠르게 실행하도록 최적화되어 있습니다.그리고 물론, 만약rand()함수가 동일한 값을 반환하고 결과가 동일하며, 같은 확률이 1/32767입니다..rand()로로 합니다.mt_rand()

function gen_uid($l=5){
   return substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"), 10, $l);
}
echo gen_uid();

기본값 [5]:WVPJZ

echo gen_uid(30);

값 [30]: cAiGgtf1lDpFWoVwjykNKXv6SC4Q2

Larabel 5 프레임워크의 도우미 기능

/**
 * Generate a "random" alpha-numeric string.
 *
 * Should not be considered sufficient for cryptography, etc.
 *
 * @param  int  $length
 * @return string
 */
function str_random($length = 16)
{
    $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);
}

php7 이후 random_bytes 함수가 있습니다.https://www.php.net/manual/ru/function.random-bytes.php 이와 같은 임의의 문자열을 생성할 수 있습니다.

<?php
$bytes = random_bytes(5);
var_dump(bin2hex($bytes));
?>
function rndStr($len = 64) {
     $randomData = file_get_contents('/dev/urandom', false, null, 0, $len) . uniqid(mt_rand(), true);
     $str = substr(str_replace(array('/','=','+'),'', base64_encode($randomData)),0,$len);
    return $str;
}

이것은 관리자 소스에서 가져온 것입니다.

/** Get a random string
* @return string 32 hexadecimal characters
*/
function rand_string() {
    return md5(uniqid(mt_rand(), true));
}

관리자, PHP로 작성된 데이터베이스 관리 도구입니다.

yii2 프레임워크에서

/**
 * Generates a random string of specified length.
 * The string generated matches [A-Za-z0-9_-]+ and is transparent to URL-encoding.
 *
 * @param int $length the length of the key in characters
 * @return string the generated random key
 */

function generateRandomString($length = 10) {
    $bytes = random_bytes($length);
    return substr(strtr(base64_encode($bytes), '+/', '-_'), 0, $length);
}
/**
 * @param int $length
 * @param string $abc
 * @return string
 */
function generateRandomString($length = 10, $abc = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
{
    return substr(str_shuffle($abc), 0, $length);
}

출처: http://www.xeweb.net/2011/02/11/generate-a-random-string-a-z-0-9-in-php/

또 다른 한 줄의 행은 문자와 숫자가 포함된 10자로 이루어진 임의의 문자열을 생성합니다.이 명령어는 다음 명령어를 가진 어레이를 만듭니다.range(두 번째 파라미터를 조정하여 크기를 설정합니다)는 이 어레이를 루프하여 임의의 ASCII 문자(범위 0-9 또는 a-z)를 할당한 후 어레이를 삽입하여 문자열을 가져옵니다.

$str = implode('', array_map(function () { return chr(rand(0, 1) ? rand(48, 57) : rand(97, 122)); }, range(0, 9)));

주의: 이것은 PHP 5.3 이후에서만 작동합니다.

라이너 하나.

뭔가 독특한 큰 현악기라면 빠릅니다.

function random_string($length){
    return substr(str_repeat(md5(rand()), ceil($length/32)), 0, $length);
}
function randomString($length = 5) {
    return substr(str_shuffle(implode(array_merge(range('A','Z'), range('a','z'), range(0,9)))), 0, $length);
}

다음은 진정한 고유 랜덤 키를 얻기 위한 방법입니다.

$Length = 10;
$RandomString = substr(str_shuffle(md5(time())), 0, $Length);
echo $RandomString;

time()은 Unix 타임스탬프이며 위의 다른 랜덤과 비교하여 항상 고유하기 때문에 사용할 수 있습니다.그런 다음 md5sum을 생성하고 생성된 MD5 문자열에서 원하는 길이를 얻을 수 있습니다.이 경우는 10글자를 사용하고 있기 때문에, 보다 독특한 것을 원한다면 긴 문자열을 사용할 수 있습니다.

이게 도움이 됐으면 좋겠어요.

편집된 버전의 기능은 정상적으로 동작하지만, 단 한 가지 문제가 발견되었습니다.$characters를 묶는 데 잘못된 문자를 사용했습니다.따라서 ' 문자가 생성되는 랜덤 문자열의 일부일 수 있습니다.

이 문제를 해결하려면 다음 사항을 변경하십시오.

$characters = ’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;

대상:

$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

이렇게 하면 둘러싸인 문자만 사용되며, ' 문자는 생성되는 랜덤 문자열의 일부가 되지 않습니다.

function generateRandomString($length = 10, $hasNumber = true, $hasLowercase = true, $hasUppercase = true): string
{
    $string = '';
    if ($hasNumber)
        $string .= '0123456789';
    if ($hasLowercase)
        $string .= 'abcdefghijklmnopqrstuvwxyz';
    if ($hasUppercase)
        $string .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    return substr(str_shuffle(str_repeat($x = $string, ceil($length / strlen($x)))), 1, $length);
}

및 용도:

echo generateRandomString(32);

openssl_random_pseudo_bytes를 사용한 마지막 코멘트는 마음에 들었지만, 아직 원하지 않는 문자를 삭제해야 하고, 정해진 길이의 문자열을 얻을 수 없었기 때문에 해결 방법은 아니었습니다.여기 내 해결책이 있다...

function rndStr($len = 20) {
    $rnd='';
    for($i=0;$i<$len;$i++) {
        do {
            $byte = openssl_random_pseudo_bytes(1);
            $asc = chr(base_convert(substr(bin2hex($byte),0,2),16,10));
        } while(!ctype_alnum($asc));
        $rnd .= $asc;
    }
    return $rnd;
}

언급URL : https://stackoverflow.com/questions/4356289/php-random-string-generator

반응형