2013-01-03 100 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);