Генерируем безопасный пароль на PHP
Многие ресурсы требуют от пользователя иметь "безопасный пароль", включающий в себя как латинские буквы в разных регистрах, так и цифры, да ещё и специальные символы. А программисту иногда требуется автоматизировать задачу генерации такого пароля. Ниже приводится очевидная функция для решения подобной задачи, при необходимости её легко модифицировать под свои нужды, пользуясь комментариями в исходнике.
Метод возвращает строку с паролем нужного вида, а его параметрами являются:
$l
- длина пароля в символах, по умолчанию8
;$c
- количество больших букв в пароле, по умолчанию0
;$n
- количество цифр в пароле, по умолчанию0
;$s
- количество специальных символов в пароле, по умолчанию0
.
Количество маленьких букв, оставшихся в строке пароля, вычисляется как $l-($c+$n+$s)
. Вот полный листинг скрипта с функцией и её тестовым вызовом, пользовательская обработка ошибок в значениях параметров сделана удобным методом trigger_error.
<?php function generatePassword ($l = 8, $c = 0, $n = 0, $s = 0) { define ('MIN_PASSWORD_LENGTH','6'); define ('MAX_PASSWORD_LENGTH','21'); //максимальная и минимальная длины пароля //Пароль из $l символов, включая $c больших букв, $n цифр и $s спецсимволов //Количество маленьких букв будет равно $l-($c+$n+$s) $cnt = $c + $n + $s; if (!is_int($l) || !is_int($c) || !is_int($n) || !is_int($s)) { trigger_error ('Метод generatePassword: аргументы не являются натруальными числами', E_USER_WARNING); return false; } elseif ($l < MIN_PASSWORD_LENGTH || $l > MAX_PASSWORD_LENGTH || $c < 0 || $n < 0 || $s < 0) { trigger_error ('Метод generatePassword: недопустимые значения аргументов', E_USER_WARNING); return false; } elseif ($c > $l || $n > $l || $s > $l) { trigger_error ('Метод generatePassword: требуемое количество символов $c, $n или $s больше длины пароля', E_USER_WARNING); return false; } elseif ($cnt > $l) { trigger_error ('Метод generatePassword: требуемое общее количество символов $c+$n+$s больше длины пароля', E_USER_WARNING); return false; } $chars = "abcdefghijklmnopqrstuvwxyz"; //разрешённые маленькие буквы $caps = strtoupper($chars); //делаем строку больших букв $nums = "0123456789"; //разрешённые цифры $syms = "~!@#$%^&*-+?.,"; //разрешённые спец.символы $password = ''; for ($i = 0; $i < $l; $i++) $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); if ($cnt) { $base_chars = str_split ($password); //базовый пароль из символов пишем в массив $added_chars = array(); for ($i = 0; $i < $c; $i++) array_push ($added_chars, substr($caps, mt_rand(0, strlen($caps) - 1), 1)); for($i = 0; $i < $n; $i++) array_push ($added_chars, substr($nums, mt_rand(0, strlen($nums) - 1), 1)); for($i = 0; $i < $s; $i++) array_push ($added_chars, substr($syms, mt_rand(0, strlen($syms) - 1), 1)); $base_chars = array_slice ($base_chars, 0, $l - $cnt); //убираем лишние буквы $base_chars = array_merge ($base_chars, $added_chars); //добавляем вместо них другие символы shuffle ($base_chars); //перемешиваем массив $password = implode('', $base_chars); //превращаем обратно в строку } return $password; } echo generatePassword (12,1,2,1); //12 символов, из них 1 большая буква, 2 цифры и 1 спец.символ ?>
09.03.2017, 15:53 [4053 просмотра]