0

私はYiiに取り組んでいます。20桁のランダムキーを生成したい。私は関数を次のように書いていました-

public function GenerateKey()
{
    //for generating random confirm key
     $length = 20;
     $chars = array_merge(range(0,9), range('a','z'), range('A','Z'));
     shuffle($chars);
     $password = implode(array_slice($chars, 0, $length));
     return $password;
}

この関数は、20 桁のキーを正しく生成しています。しかし、
「g12a-Gh45-gjk7-nbj8-lhk8」のような形式のキーが必要です。つまり、ハイフンで区切ります。では、どのような変更を行う必要がありますか?

4

2 に答える 2

0

ハイフンを追加するには、chunk_split()を使用できます。substr()は、追加する末尾のハイフンを削除するために使用され、実際にグループを区切るハイフンのみを残します。

return substr(chunk_split($password, 4, '-'), 0, 24);

ただし、shuffle()は比較的貧弱な PRNGを使用するだけでなく、同じ文字を 2 回使用することを許可しないことに注意してください。代わりに、for ループでmt_rand()を使用すると、chunk_split() の使用を簡単に回避できます。

$password = '';
for ($i = 0; $i < $length; $i++) {
    if ( $i != 0 && $i % 4 == 0 ) { // nonzero and divisible by 4
        $password .= '-';
    }
    $password .= $chars[mt_rand(0, count($chars) - 1)];
}
return $password;

(mt_rand() でさえ、暗号的に安全な PRNG ではありません。予測が非常に難しいもの (暗号化キーやパスワード リセット トークンなど)を生成する必要がある場合は、 openssl_random_pseudo_bytes()を使用してバイトを生成してから、次のような別の関数を使用します。 bin2hex()でそれらを印刷可能な文字にエンコードします。私は Yii に詳しくないので、Yii にこの機能があるかどうかはわかりません。)

于 2013-01-03T09:54:33.257 に答える