这是一种生成随机密码的安全方式吗?

时间:2014-02-23 20:14:14

标签: php security passwords

基本上我有一个允许成员注册的脚本,密码当前必须包含至少1个小写,1个大写,1个数字和1个特殊字符,密码长度也必须至少为8个字符。 / p>

在注册和密码更改页面上,我想建议3个随机生成的强密码,但不确定我的方法是否是最好的方法。

基本上我运行substr(str_shuffle());对于4组字符,第一组是小写,第二组是大写,第三组是数字,第四是特殊字符。

某些字母/数字已被省略,例如零和O,以避免混淆2.我还重复了每个字符,以允许每个字符的选项被包含多次。

然后我在前4个结果的输出上做一个最终的substr(str_shuffle())来生成一个长度为10个字符的密码,并且每个包含至少2个小写,大写,数字和特殊字符。

// Generates a secure random password
$random_LC = substr(str_shuffle("abcdefghjkmnpqrstuvwxyzabcdefghjkmnpqrstuvwxyz"), 0, 2);
$random_UC = substr(str_shuffle("ABCDEFGHJKLMNPQRSTUVWXYZABCDEFGHJKLMNPQRSTUVWXYZ"), 0, 2);
$random_NC = substr(str_shuffle("2345678923456789"), 0, 2);
$random_SC = substr(str_shuffle("@~#[]{}+&*%()£$\/<>@~#[]{}+&*%()£$\/<>"), 0, 4);

$random_PW = substr(str_shuffle("$random_LC$random_UC$random_NC$random_SC"), 0, 10);
$random_PW2 = substr(str_shuffle("$random_LC$random_UC$random_NC$random_SC"), 0, 10);
$random_PW3 = substr(str_shuffle("$random_LC$random_UC$random_NC$random_SC"), 0, 10);

然后输出可以通过$ random_PW,$ random_PW2等回显。

上述代码输出的当前示例

vH}[2p$W2&
5$/wM6q(\P
qM5w6/$\P(
$PM\/65w(q

我相信如果我只针对所有字符做了1个substr(str_shuffle()),那么很有可能它不符合输出中包含的每个字符类型中至少1个的要求。

是否有更简单的方法来生成符合上述要求的随机密码?

1 个答案:

答案 0 :(得分:1)

  1. 我建议也改变密码的长度。

  2. 可能最好不要有一定数量的特殊字符,小写字母,大写字母和数字。您可以确保至少有其中一个并生成混合字符的随机变体。

  3. 这是一个改进版本(生成8到12个字符之间的密码,符合您要求的标准):

    $chr = array_merge(
            range('A', 'N'), range('P', 'Z'),
            range('a', 'n'), range('p', 'z'),
            range(2, 9), str_split('@~#[]{}+&*%()£$\/<>')
           );
    
    $password = $chr[mt_rand(0, 24)] . $chr[mt_rand(25, 49)]
              . $chr[mt_rand(50, 57)] . $chr[mt_rand(58, 76)];
    
    for ($i = rand(4, 8); $i >= 0; $i--) {
        $password .= $chr[mt_rand(0, count($chr) - 1)];
    }
    
    $password = str_shuffle($password);