如何生成用连字符分隔的随机密钥

时间:2013-01-03 09:12:51

标签: php random yii

我正在研究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分开。那么我需要做些什么改变呢?

2 个答案:

答案 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);