2013-01-03 55 views
0

我正在Yii上工作。我想生成20位数字的随机密钥。我写了一个函数为 -如何生成由hypen分隔的随机密钥

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”。即通过炒作分开。那么我需要做些什么改变?

+0

你真的想从来没有使用相同的字符两次? – PleaseStand

回答

0

您可以使用chunk_split()添加连字符。 substr()用于删除它添加的尾部连字符,只留下实际分隔组的连字符。

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

但是,请注意shuffle()不仅采用了relatively poor PRNG而且也不会允许相同的字符使用两次。相反,使用mt_rand()在for循环中,然后使用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,所以我不能说它是否有此功能)

0

您可以使用此Yii的内部函数:

Yii::app()->getSecurityManager()->generateRandomString($length);