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

41

Від автора: при створенні механізму реєстрації користувачів на сайті, іноді виникає необхідність генерації пароля для користувача. Так як паролі, придумані користувачами для своїх облікових записів, часто дуже прості, а значить, уразливі для зловмисників. Тому в даному уроці ми з Вами створимо генератор паролів для сайту, завдяки якому Ви зможете забезпечити високу безпеку створюваних облікових записів.

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

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

Для сьогоднішнього уроку, я створив дуже просту html сторінку, яку ми будемо використовувати для сьогоднішнього скрипта:

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

Ось вихідний код цієї сторінки:

Логін:

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

Отже, який же пароль є безпечним? Це такий пароль, який дуже важко підібрати, тому що дуже часто процес злому облікового запису зводиться до простого підбору пароля – тобто перебір символів, поки не знайдеться відповідна послідовність. Тому, погодьтеся, якщо пароль буде складатися із кількості символів, наприклад, тільки з малих англійських букв – його буде дуже легко підібрати. Але якщо ж ми створимо пароль, що складається з малих і великих букв, а також включає в себе цифри – це вже буде досить складний і безпечний пароль. Тому ми з Вами в цьому уроці, реалізуємо генерацію двох видів паролів. Отже, давайте приступимо.

Конфігураційний файл

Для реалізації логіки скрипта нам необхідно створити файл для зберігання деяких налаштувань, до того ж, якщо Ви будете застосовувати даний скрипт для свого сайту, то скоріш за все у Вас буде свій конфігураційний файл. Тому, думаю, буде доречно його створити. Отже, створюємо файл config.php і додаємо в нього наступний код:

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

include ‘config.php’;

Перший варіант генерації пароля

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

include ‘functions.php’;

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

$res = get_pass();

Тепер переходимо в файл functions.php і почнемо писати код функції 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:

Ваш пароль:

Давайте подивися в браузері, що вийшло:

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

Як Ви бачите, все нормально працює, але при такій генерації може виникнути ситуація, коли будуть повторюватися поруч йдуть символи. Тому давайте додамо невеликий код, який виправить цю проблему:

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

Давайте подивимося, який результат ми отримавши браузері:

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

На цьому даний урок можна завершувати. Всього Вам доброго і вдалого кодування. І побачимося в наступних уроках.