【问题标题】:How to make a random password generator with at least one capital letter, lowercase letter, special character and number everytime in php [duplicate]如何在php中每次使用至少一个大写字母,小写字母,特殊字符和数字制作随机密码生成器[重复]
【发布时间】:2021-03-09 19:36:51
【问题描述】:

我正在尝试做标题所说的事情,这就是我能弄清楚如何在 php 中做的所有事情。

<?php 
    $random = substr(md5(mt_rand()), 0, 8
    echo $random;
?>

【问题讨论】:

标签: php random passwords generator


【解决方案1】:

我创建了这个基本代码:

$digits    = array_flip(range('0', '9'));
$lowercase = array_flip(range('a', 'z'));
$uppercase = array_flip(range('A', 'Z')); 
$special   = array_flip(str_split('!@#$%^&*()_+=-}{[}]\|;:<>?/'));
$combined  = array_merge($digits, $lowercase, $uppercase, $special);

$password  = str_shuffle(array_rand($digits) .
                         array_rand($lowercase) .
                         array_rand($uppercase) . 
                         array_rand($special) . 
                         implode(array_rand($combined, rand(4, 8))));

echo $password;

首先我创建数组,其中的键是变量名所描述的内容。这可能看起来有些奇怪,但这样做是因为array_rand() 返回的是随机键,而不是随机值。

通过明确定义不同类型的字符,您可以删除一些讨厌的字符。例如,可能很难区分I1|lO0,具体取决于您的字体。您可能想要删除这些。您还可以定义自己的特殊字符集。

然后我通过明确声明保证至少存在一个大写字母、一个小写字母、一个特殊字符和一个数字。

最后我添加了一部分随机长度的随机字符并将整个字符串打乱。

注意:为用户选择密码可能是个好主意。用户经常发现很难选择一个好的密码。但是,您将使用非常难以记住且难以输入的密码。这真的有必要吗?例如,如果您要求提供电子邮件地址和密码,那么 5 位 PIN 码已经提供了 99999 个可能的密码。好多啊。如果您只允许用户尝试输入错误密码 5 次,在登录表单被阻止之前,那么黑客只有 0.006% 的机会通过暴力破解成功。这些都不是好机会。对于用户来说,五位密码更容易使用。密码的强度应与其保护的内容和其他风险因素成正比。您可能使用的密码有 0.00000000001% 的成功破解几率,但如果用户“自愿”将密码提供给黑客(例如通过social hacking)的几率为 0.0001%,那么这种安全性毫无意义密码。

【讨论】:

    【解决方案2】:
    public function randomPasswordGenerator()
    {
    
        $password = '';
        $passwordSets = ['1234567890', '%^&@*#(){}', 'ABCDEFGHJKLMNPQRSTUVWXYZ', 'abcdefghjkmnpqrstuvwxyz'];
    
        //Get random character from the array
        foreach ($passwordSets as $passwordSet) {
            $password .= $passwordSet[array_rand(str_split($passwordSet))];
        }
    
        // 6 is the length of password we want
        while (strlen($password) < 6) {
            $randomSet = $passwordSets[array_rand($passwordSets)];
            $password .= $randomSet[array_rand(str_split($randomSet))];
        }
        echo $password;
    }
    

    【讨论】:

    • 抱歉,随机的,因为你已经实现了,这有时会不满足要求
    • 这只是实现它的一个基本思路。
    • @GetSet 你能解释一下你的评论吗?
    • 这在我看来是一个很好的解决方案。但是,我会在末尾添加一个最终的str_shuffle(),请参阅我的答案,否则密码将始终以数字开头,然后是特殊字符,依此类推。
    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多