我正在研究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”。即由hypen分开。那么我需要做些什么改变呢?
答案 0 :(得分:0)
您可以使用chunk_split()添加连字符。 substr()用于删除它添加的尾随连字符,只留下实际上分隔组的连字符。
return substr(chunk_split($password, 4, '-'), 0, 24);
但是,请注意shuffle()不仅使用relatively poor PRNG,而且也不允许使用相同的字符两次。相反,在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。如果你需要生成必须极难以预测的东西(例如加密密钥或密码重置令牌),请使用{{3生成字节,然后生成一个单独的函数,如openssl_random_pseudo_bytes(),将它们编码为可打印的字符。我不熟悉Yii,所以我不能说它是否具有此功能。)
答案 1 :(得分:0)
您可以使用此Yii内部功能:
Yii::app()->getSecurityManager()->generateRandomString($length);