От автора: при создании механизма регистрации пользователей на сайте, иногда возникает необходимость генерации пароля для пользователя. Так как пароли, придуманные пользователями для своих учетных записей, зачастую очень просты, а значит, уязвимы для злоумышленников. Поэтому в данном уроке мы с Вами создадим генератор паролей для сайта, благодаря которому Вы сможете обеспечить высокую безопасность создаваемых учетных записей.
Постановка задачи
Для сегодняшнего урока, я создал очень простую html страницу, которую мы будем использовать для сегодняшнего скрипта:
Вот исходный код, данной страницы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<? header("Content-Type:text/html;charset=utf-8"); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <link rel="stylesheet" href="style.css"> <title></title> </head> <body> <form method="post"> Логин: <br /> <input type="text" name="login"> <br /> Ваш пароль: <br /> <input type="text" name="password" value="<?=$res;?>"> </form> </body> </html> |
Используя данную страницу, мы с Вами должны создать скрипт, который будет выполнять генерацию пароля для пользователя. Конечно, решить данную задачу можно различными способами, но перед этим, давайте определимся какой, пароль должен получиться в результате генерации, что бы он был безопасным.
Итак, какой же пароль является безопасным? Это такой пароль, который очень сложно подобрать, так как очень часто процесс взлома учетной записи сводится к простому подбору пароля – то есть перебор символов, пока не найдется подходящая последовательность. Поэтому, согласитесь, если пароль будет состоять из малого количества символов и, к примеру, только из малых английских букв – его будет очень легко подобрать. Но если же мы создадим пароль, состоящий из малых и больших букв, а также включающий в себя цифры – это уже будет довольно сложный и безопасный пароль. Поэтому мы с Вами в данном уроке, реализуем генерацию двух видов паролей. Итак, давайте приступим.
Конфигурационный файл
Для реализации логики скрипта нам необходимо создать файл для хранения некоторых настроек, к тому же если Вы будете применять данный скрипт для своего сайта, то у Вас скорее всего будет свой конфигурационный файл. Поэтому, думаю, будет уместно его создать. Значит, создаем файл config.php и добавляем в него следующий код:
1 2 3 |
<?php define('LENGTH',10); ?> |
Настройка нам потребуется всего лишь одна – это количество символов пароля. Для хранения настроек будем использовать обычные константы. Сразу же давайте подключим данный файл к нашему тестовому сайту:
1 |
include 'config.php'; |
Первый вариант генерации пароля
Итак, теперь давайте создадим файл functions.php, который будем использовать для хранения функций генератора паролей. И сразу же подключим данный файл в файле index.php:
1 |
include 'functions.php'; |
Также добавим вызов функции, которая собственно и будет возвращать сгенерированный пароль (опять же в файле index.php):
1 |
$res = get_pass(); |
Теперь переходим в файл functions.php и начнем писать код функции get_pass():
1 2 3 4 |
<?php function get_pass() { //код генератора } |
Первым делом необходимо определиться с символами, из которых мы будем генерировать пароль. Поэтому давайте сформируем специальную строку, в которой будут храниться символы для генерации будущего пароля. Конечно, для этих целей можно воспользоваться массивом, но с массив мы будем использовать во втором варианте генератора паролей, поэтому строки будет вполне достаточно. Вот собственно данная строка:
1 |
$str = "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"; |
Как Вы видите это большие и малые буквы и цифры. Дальше необходимо определить длину данной строки и индекс последнего символа. Так как при генерации пароля мы будем использовать обычный цикл и случайным образом выбирать из данной строки символы. А доступ к каждому символу строки, можно получить по его индексу (номеру). Напомню, что индексация символов в строке начинается с нуля. Поэтому что бы узнать индекс последнего символа в строке, необходимо определить ее длину и вычесть единицу:
1 |
$str_lenght = strlen($str) - 1; |
Дальше создаем переменную, в которую буде сохранен сгенерированный пароль:
1 |
$str_gen = ''; |
Теперь в цикле необходимо выполнить генерацию нового пароля:
1 2 3 4 5 6 7 |
for($i = 0; $i < LENGTH; $i++) { $x = mt_rand(0,$str_lenght); $str_gen .= $str[$x]; } return $str_gen; |
Как Вы видите, это обычный цикл for(), в котором:
$i – это счетчик итераций;
$i < LENGTH – условие выхода из цикла, цикл будет выполнятся до тех пор, пока количество итераций цикла, меньше значения хранящегося в константе LENGTH (количество символов пароля). То есть на каждой итерации цикла, мы будем поучать всего лишь один символ пароля;
$i++ — после каждой итерации, увеличиваем значение переменной $i на еденицу.
Далее, используя функцию mt_rand(0,$str_lenght), мы получаем случайное число в диапазоне от 0 до $str_lenght.
Напомню, что функция mt_rand — генерирует случайное значение методом mt, Она использует генератор случайных чисел с известными характеристиками, основанный на «Вихре Мерсенна», который генерирует случайные числа в среднем в четыре раза быстрее чем rand().
То есть случайным образом определяем индекс для получения символа из строки $str, что собственно далее и выполняем. И после завершения цикла в переменной $str_gen, получаем сгенерированный пароль, который возвращаем при помощи конструкции return
Теперь, можно посмотреть результаты нашей работы, единственное, необходимо в файле index.php вывести на экран получившеюся строку, для этого мы используем тег input:
1 2 |
Ваш пароль: <br /> <input type="text" name="password" value="<?=$res;?>"> |
Давайте посмотри в браузере, что получилось:
Как Вы видите, все нормально работает, но при такой генерации может возникнуть ситуация, когда будут повторяться рядом идущие символы. Поэтому давайте добавим небольшой код, который исправит эту проблему:
1 2 3 4 5 6 |
if($i != 0 ) { if($str_gen[strlen($str_gen) - 1] == $str[$x]) { $i--; continue; } } |
Смотрите, будем сравнивать символ, сгенерированный на предыдущей итерации цикла (если конечно это не первая итерация), с символом, полученным на текущей итерации. Если они равны, значит, необходимо повторить генерацию символа. Для этого уменьшаем счетчик итераций на единицу $i—, и переходим на следующую итерацию. Давайте еще раз посмотрим в браузере, что получилось:
Как Вы видите, все успешно работает. На всякий случай приведу полный код функции генерации пароля:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function get_pass() { $str = "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"; $str_lenght = strlen($str) - 1; $str_gen = ''; for($i = 0; $i < LENGTH; $i++) { $x = mt_rand(0,$str_lenght); if($i != 0 ) { if($str_gen[strlen($str_gen) - 1] == $str[$x]) { $i--; continue; } } $str_gen .= $str[$x]; } return $str_gen; } |
Второй вариант генерации пароля
Итак, мы с Вами рассмотрели, один из вариантов генерации случайного пароля. Теперь давайте рассмотрим еще один вариант.
В этом примере я предлагаю создать такой пароль, у которого гласные буквы будут чередоваться с согласными и наоборот. Конечно не используя цифры, мы уменьшаем безопасность будущего пароля, но думаю, при желании Вы сможете доработать данный скрипт, используя и цифры.
Первым делом определяем символы, которые будут использоваться при генерации пароля. В этом примере мы будем использовать массивы для хранения набора символов:
1 2 3 4 5 |
$gl = array('y','Y','e','E','u','U','i','I','o','O','a','A'); $so = array('w','W','r','R','t','T','p','P','s','S','d','D','f','F','g', 'G','h','H','j','J','k','K','l','L','z','Z','x','X','c','C','v','V', 'b','B','n','N','m','M'); |
Обратите внимание, создаем два массива: $gl – для хранения гласных, $so – для хранения согласных.
Далее давайте создадим переменную, в которую будем сохранять сгенерированный пароль. Так как есть два варианта чередования символов в пароле – вначале гласные затем согласные и наоборот. Значит, в начале, нужно случайным образом определять какой вариант использовать. Для этого случайным образом будем определять число от нуля до 20.
1 |
$v = mt_rand(1,20); |
И, к примеру, если получившееся число больше 9, значит, будем использовать чередование гласные — согласные. В другом случае – согласные- гласные.
1 2 3 4 5 6 7 |
if($v > 9) { /// гласные - согласные } else { // согласные- гласные } |
Теперь для генерации пароля, необходимо создать цикл, в котором мы будем случайным образом, на каждой итерации цикла, получать символы из существующих массивов ($gl, $so) и добавлять их в переменную $result. Итак, цикл для чередования гласные-согласные:
1 2 3 4 5 6 7 |
for($i = 0; $i < LENGTH; $i+=2 ) { $in = mt_rand(0,count($gl)-1); $result .= $gl[$in]; $in = mt_rand(0,count($so)-1); $result .= $so[$in]; } |
Параметры цикла:
$i – счетчик итераций цикла;
$i < LENGTH – условие выхода из цикла - цикл выполняется пока счетчик итераций меньше значения константы LENGTH;
$i+=2 – действие после каждой итерации цикла. Так как на каждой итерации цикла мы будем получать по два символа пароля, значит, счетчик итераций нужно увеличивать на два.
В коде цикла действуем аналогично первому примеру, то есть случайно определяем индексы ячеек массива. Как обычно диапазон определения случайных чисел, задаем от нуля (индексация массива начинается с нуля) и до индекса последней ячейки массива. Индекс последней ячейки массива определяем, используя функцию count(), которая возвращает количество ячеек массива.
Но вначале, определяем индекс ячейки для массива гласных, а затем индекс – для массива согласных. И по этим индексам заносим символы в переменную $result. Аналогичный цикл для чередования согласные-гласные:
1 2 3 4 5 6 7 8 9 |
for($j = 0; $j < LENGTH; $j+=2 ) { $in = mt_rand(0,count($so)-1); $result .= $so[$in]; $in = mt_rand(0,count($gl)-1); $result .= $gl[$in]; } |
И в конце как обычно возвращаем полученный пароль – то есть переменную $result. Теперь давайте приведу полный код функции генерации пароля:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
function get_pass() { $gl = array('y','Y','e','E','u','U','i','I','o','O','a','A'); $so = array('w','W','r','R','t','T','p','P','s','S','d','D','f','F', 'g','G','h','H','j','J','k','K','l','L','z','Z','x','X','c','C', 'v','V','b','B','n','N','m','M'); $result = ''; $v = mt_rand(1,20); if($v > 9) { ///gl-so for($i = 0; $i < LENGTH; $i+=2 ) { $in = mt_rand(0,count($gl)-1); $result .= $gl[$in]; $in = mt_rand(0,count($so)-1); $result .= $so[$in]; } } else { //so-gl for($j = 0; $j < LENGTH; $j+=2 ) { $in = mt_rand(0,count($so)-1); $result .= $so[$in]; $in = mt_rand(0,count($gl)-1); $result .= $gl[$in]; } } return $result; } |
Давайте посмотрим, какой результат мы получив браузере:
На этом данный урок можно завершать. Всего Вам доброго, удачного кодирования. И увидимся в следующих уроках.
Комментарии (2)