Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这是生成随机密码的安全方法吗?_Php_Security_Passwords - Fatal编程技术网

Php 这是生成随机密码的安全方法吗?

Php 这是生成随机密码的安全方法吗?,php,security,passwords,Php,Security,Passwords,基本上我有一个脚本,允许成员注册,密码当前必须包含至少1个小写、1个大写、1个数字和1个特殊字符,密码长度也必须至少为8个字符 在注册和密码更改页面上,我想建议3个随机生成的强密码,但不确定我的方法是否是最好的方法 基本上我运行substr(str_shuffle());针对4组字符,第一组是小写,第二组是大写,第三组是数字,第四组是特殊字符 // Generates a secure random password $random_LC = substr(str_shuffle("abcdef

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

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

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

// 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);
某些字母/数字已输入,如0和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);
我相信,如果我只是对所有字符执行1个substr(str_shuffle()),很有可能无法满足输出中至少包含1个字符类型的要求

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

  • 我还建议更改密码的长度

  • 也许最好不要有固定数量的特殊字符、小写字母、大写字母和数字。您可以确保至少有一个这样的字符,并生成混合字符的随机变体

  • // 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);
    
    这是一个改进的版本(生成8到12个字符的密码,并满足您所需的条件):

    $chr=array\u merge(
    范围('A','N'),范围('P','Z'),
    范围('a','n'),范围('p','z'),
    范围(2,9),stru分割('@~#[]{}+&*%()英镑\/'))
    );
    $password=$chr[mt_rand(0,24)]$chr[mt_rand(25,49)]
    . $克朗[mt_rand(50,57)]$chr[mt_rand(58,76)];
    对于($i=rand(4,8);$i>=0;$i--){
    $password.=$chr[mt_rand(0,count($chr)-1)];
    }
    $password=str_shuffle($password);
    
    您是否意识到这种设计在多大程度上限制了密码空间?8个字符的密码空间有超过72^8=722204136308736个字符,但通过添加这些限制,您有26*26*10*10(特殊值)*72^4=1816672665600个可能的组合。请考虑添加更多的字符。从数学的角度来看,这些密码可能是强密码,但它们不是从可用性的角度来看的。没有人会记得他们!让用户选择他们自己的密码。他们可以选择自己的密码,这些密码会作为建议显示在页面上。我想不是每100个人中就有一个人会接受你的建议。这段代码有一个小错误。刷新几次后,它会生成一个字符
    U
    ,其他时间是一个空白屏幕,其他时间是3个字符长度
    4Iy
    。如果在浏览器中运行它,可能会遇到“我已经看过几次了,但即使是这样,也应该看到。你如何解释空白屏幕上的空源?(25次刷新时发生了3次)下面是上面代码的演示:(它工作得很好)