public static GenerateSecurePassword ( integer $length = 16, array $sets = null, array $enabledSets = null ) : string | ||
$length | integer | optional Password length |
$sets | array | optional User (re-)defined characters sets |
$enabledSets | array | optional Names of enabled sets, if null — all sets are enabled |
Résultat | string | Returns generated password |
public static function GenerateSecurePassword($length = 16, array $sets = null, array $enabledSets = null)
{
static $predefinedSets = ['l' => 'abcdefghjkmnpqrstuvwxyz', 'u' => 'ABCDEFGHJKMNPQRSTUVWXYZ', 'd' => '1234567890', 's' => '!@#$%&*?'];
$sets = empty($sets) ? $predefinedSets : array_merge($predefinedSets, $sets);
if (!empty($enabledSets)) {
$sets = array_intersect_key($sets, array_flip($enabledSets));
}
$password = '';
foreach ($sets as $set) {
$password .= $set[mt_rand(0, strlen($set) - 1)];
}
$all = implode($sets);
$setLength = strlen($all) - 1;
$length -= count($sets);
for ($i = 0; $i < $length; $i++) {
$password .= $all[mt_rand(0, $setLength)];
}
return str_shuffle($password);
}
public function testMinimumComplexity() { $sets = ['l' => str_split('abcdefghjkmnpqrstuvwxyz'), 'u' => str_split('ABCDEFGHJKMNPQRSTUVWXYZ'), 'd' => str_split('1234567890'), 's' => str_split('!@#$%&*?')]; for ($i = 0; $i < static::TEST_SETS_COUNT; $i++) { $password = str_split(\Scalr::GenerateSecurePassword(static::PASSWORD_LENGTH)); foreach ($sets as $setName => $set) { $this->assertNotEmpty(array_intersect($password, $set), "Password doesn't contain any characters from the group '{$setName}'"); } } }