Php 这是生成随机密码的安全方法吗?
基本上我有一个脚本,允许成员注册,密码当前必须包含至少1个小写、1个大写、1个数字和1个特殊字符,密码长度也必须至少为8个字符 在注册和密码更改页面上,我想建议3个随机生成的强密码,但不确定我的方法是否是最好的方法 基本上我运行substr(str_shuffle());针对4组字符,第一组是小写,第二组是大写,第三组是数字,第四组是特殊字符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
// 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次)下面是上面代码的演示:(它工作得很好)