Генератор паролей для сайта

Генератор паролей для сайта

От автора: при создании механизма регистрации пользователей на сайте, иногда возникает необходимость генерации пароля для пользователя. Так как пароли, придуманные пользователями для своих учетных записей, зачастую очень просты, а значит, уязвимы для злоумышленников. Поэтому в данном уроке мы с Вами создадим генератор паролей для сайта, благодаря которому Вы сможете обеспечить высокую безопасность создаваемых учетных записей.

скачать исходникискачать урок

Постановка задачи

Для сегодняшнего урока, я создал очень простую html страницу, которую мы будем использовать для сегодняшнего скрипта:

Вот исходный код, данной страницы:

<?
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 и добавляем в него следующий код:

<?php
define('LENGTH',10);
?>

Настройка нам потребуется всего лишь одна – это количество символов пароля. Для хранения настроек будем использовать обычные константы. Сразу же давайте подключим данный файл к нашему тестовому сайту:

include 'config.php';

Первый вариант генерации пароля

Итак, теперь давайте создадим файл functions.php, который будем использовать для хранения функций генератора паролей. И сразу же подключим данный файл в файле index.php:

include 'functions.php';

Также добавим вызов функции, которая собственно и будет возвращать сгенерированный пароль (опять же в файле index.php):

$res = get_pass();

Теперь переходим в файл functions.php и начнем писать код функции get_pass():

<?php
function get_pass() {
//код генератора
}

Первым делом необходимо определиться с символами, из которых мы будем генерировать пароль. Поэтому давайте сформируем специальную строку, в которой будут храниться символы для генерации будущего пароля. Конечно, для этих целей можно воспользоваться массивом, но с массив мы будем использовать во втором варианте генератора паролей, поэтому строки будет вполне достаточно. Вот собственно данная строка:

$str = "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";

Как Вы видите это большие и малые буквы и цифры. Дальше необходимо определить длину данной строки и индекс последнего символа. Так как при генерации пароля мы будем использовать обычный цикл и случайным образом выбирать из данной строки символы. А доступ к каждому символу строки, можно получить по его индексу (номеру). Напомню, что индексация символов в строке начинается с нуля. Поэтому что бы узнать индекс последнего символа в строке, необходимо определить ее длину и вычесть единицу:

$str_lenght = strlen($str) - 1;

Дальше создаем переменную, в которую буде сохранен сгенерированный пароль:

$str_gen = '';

Теперь в цикле необходимо выполнить генерацию нового пароля:

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:

Ваш пароль: <br />
<input type="text" name="password" value="<?=$res;?>">

Давайте посмотри в браузере, что получилось:

Как Вы видите, все нормально работает, но при такой генерации может возникнуть ситуация, когда будут повторяться рядом идущие символы. Поэтому давайте добавим небольшой код, который исправит эту проблему:

if($i != 0 ) {
	if($str_gen[strlen($str_gen) - 1] == $str[$x]) {
		$i--;
		continue;
	}
}

Смотрите, будем сравнивать символ, сгенерированный на предыдущей итерации цикла (если конечно это не первая итерация), с символом, полученным на текущей итерации. Если они равны, значит, необходимо повторить генерацию символа. Для этого уменьшаем счетчик итераций на единицу $i—, и переходим на следующую итерацию. Давайте еще раз посмотрим в браузере, что получилось:

Как Вы видите, все успешно работает. На всякий случай приведу полный код функции генерации пароля:

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;
}

Второй вариант генерации пароля

Итак, мы с Вами рассмотрели, один из вариантов генерации случайного пароля. Теперь давайте рассмотрим еще один вариант.

В этом примере я предлагаю создать такой пароль, у которого гласные буквы будут чередоваться с согласными и наоборот. Конечно не используя цифры, мы уменьшаем безопасность будущего пароля, но думаю, при желании Вы сможете доработать данный скрипт, используя и цифры.

Первым делом определяем символы, которые будут использоваться при генерации пароля. В этом примере мы будем использовать массивы для хранения набора символов:

$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.

$v = mt_rand(1,20);

И, к примеру, если получившееся число больше 9, значит, будем использовать чередование гласные — согласные. В другом случае – согласные- гласные.

if($v > 9) {
		/// гласные - согласные

	}
	else {
		// согласные- гласные
	}

Теперь для генерации пароля, необходимо создать цикл, в котором мы будем случайным образом, на каждой итерации цикла, получать символы из существующих массивов ($gl, $so) и добавлять их в переменную $result. Итак, цикл для чередования гласные-согласные:

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. Аналогичный цикл для чередования согласные-гласные:

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. Теперь давайте приведу полный код функции генерации пароля:

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;
}

Давайте посмотрим, какой результат мы получив браузере:

На этом данный урок можно завершать. Всего Вам доброго, удачного кодирования. И увидимся в следующих уроках.

Фреймворк YII2: теория и первая практика

Овладейте азами фреймворка Yii2 за 5 дней!

Получить

Метки:

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (2)

  1. Evgen

    хорошее видео

  2. Виктор Гавриленко

    Спасибо!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree