Алгоритми генерації та оцінки стійкості паролів (Delphi)

Характеристика програмного забезпечення, його мета та призначення, функціональні особливості. Вимоги до розробки та її джерела. Огляд алгоритмів генерації псевдовипадкових послідовностей. Дослідження методів тестування та оцінки стійкості паролів.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык украинский
Дата добавления 22.10.2012
Размер файла 2,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Стійкість системи визначається стійкістю найслабкішої ланки, тому якщо відомо, що для шифрування використовується 40-бітовий ключ, немає ніякого сенсу використовувати пароль з більшою ентропією. Інший, що став вже класичним, приклад - алгоритм перевірки паролів в операційній системі Windows NT/2000/XP/2003. Ці системи підтримують два алгоритми - LM і NTLM. При створенні користувача або зміні його пароля ці системи обчислюють LM- і NTLM-хеші пароля і зберігають його в базі даних облікових записів.

Алгоритм обчислення LM-хеша виглядає таким чином:

· символи пароля приводяться до верхнього регістра і перетворяться в OEM-кодування;

· якщо пароль коротше 14 символів, він доповнюється пропусками до цієї величини;

· одержана послідовність з 14 символів ділиться на дві частини по 7 символів;

· кожна з одержаних частин використовується як ключ для шифрування фіксованого значення алгоритмом DES;

· одержані в результаті шифрування блоки об'єднуються - це і є LM-хеш пароля.

3.3 Засоби злому паролів

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

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

Найбільш ефективним є метод злому парольного захисту операційної системи (надалі - ОС), при якому атаці піддається системний файл, що містить інформацію про легальних користувачів і їх паролі. Проте будь-яка сучасна ОС надійно захищає призначені для користувача паролі, які зберігаються в цьому файлі, за допомогою шифрування. Крім того, доступ до таких файлів, як правило, за умовчанням заборонений навіть для системних адміністраторів, не говорячи вже про рядових користувачів операційної системи. Проте, у ряді випадків зловмиснику вдається шляхом різних хитрувань одержати в своє розпорядження файл з іменами користувачів і їх зашифрованими паролями. І тоді йому на допомогу приходять так звані парольні зломщики - спеціалізовані програми, які служать для злому паролів операційних систем.

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

За рахунок дуже великого числа комбінацій, що перебираються, яке росте експоненціально із збільшенням числа символів в початковому наборі, такі атаки парольного захисту ОС можуть віднімати дуже багато часу. Проте добре відомо, що більшість користувачів операційних систем особливо не утрудняють себе вибором стійких паролів, тобто таких, які важко зламати. Тому для ефективнішого підбору паролів зломщики звичайно використовують спеціальні словники, які є наперед сформованим списком слів, найбільш часто використовуваних на практиці як паролі.

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

· проводиться зміна буквеного регістра, в якому набране слово;

· порядок проходження букв в слові міняється на зворотний;

· у початок і в кінець кожного слова приписується цифра 1;

· деякі букви змінюються на близькі по зображенню цифри (в результаті, наприклад, із слова password можна одержати pa55w0rd).

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

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

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

Люди використовують деякі слова як паролі частіше за інших. Частотні словники перераховують найбільш популярні слова. Хороші словники містять сотні тисячі слів. Хороший частотний словник містить назви корпорацій, заголовків кінофільмів, торгові марки і т.д. Злом за допомогою словника звичайно відбувається дуже швидко, навіть якщо використовується величезний словник.

Атака «в лоб» (пошук всіх можливих паролів) не підходить для довгих паролів, тому що потрібно дуже багато часу. Головним чином є комбінації подібно до jkqmzwd, які є повністю безглуздими серед мільярдів і квінтильйонів шуканих паролів. Посилена «атака в лоб» - оптимізований алгоритм дослідження, який тільки пробує «розумні» паролі. В результаті час злому скорочується.

Швидкість перебору може сильно розрізнятися для різних випадків. Наприклад у випадку якщо швидкість перебору 1,000 паролів в секунду час в таблиці треба помножити на 10,000. Якщо швидкість перебору 15 млн. паролів в секунду, вказаний час потрібно поділити на 1.5. На щастя швидкості перебору в 100 млн. паролів в секунду на сьогоднішньому устаткуванні не зустрічаються. Отже скорочення максимального часу знаходження пароля на порядок від вказаного в таблиці вже неможливо.

«На щастя», тому що все-таки парольні системи покликані захищати. Такий великий час злому буде нам дуже не на щастя якщо ми забудемо пароль до власних даних.

Якщо зловмисник не може припустити довжину вашого пароля і вимушений буде перебирати всі варіанти паролів завдовжки скажемо від 5 до 8 символів, то час такого повного перебору очевидно може бути оцінений як сума часів перебору 5-ти, 6-ти, 7-ми, і 8-ми символьних паролів.

В результаті проведеного аналізу встановлений максимальний час злому паролів. Швидкість перебору паролів 106000 паролів в секунду (Pentium III/550).

Таблиця 3.3. Загальна оцінка часу, необхідного для злому методом «грубої сили»

Довжина паролю

Довжина набору 26 (тільки літери)

36 (літери та цифри)

70 (всі друковані символи)

Російські літери

4

Негайно

Негайно

3 хвилини

Негайно

5

1 хвилина 48 секунд

9 хвилин

3 години

5 хвилин

6

50 хвилин

5 годин 48 хвилин

10 днів 17 годин

2 години 53 хвилини

7

22 години

8 днів 17 годин

2 роки 3 дні

26 годин

8

24 дні

314 днів 17 годин

138 років

123 дні 12 годин

9

1 рік 248 днів

30 років

9363 роки

10 років

Підрахунок часу злому здійснювався програмою PwlTool.

3.4 Огляд деяких алгоритмів оцінки стійкості пароля

Аналізатор паролів SeaMonkey

Цей аналізатор паролів розроблений як частина проекту - вільного набору програм для роботи в Internet, створеного і підтримуваного організацією Seamonkey Council, що виділилася з Mozilla Foundation. Сам механізм аналізу пароля є частиною JavaScript бібліотеки при роботі з паролями. Алгоритм його роботи полягає в обчисленні ваги пароля, що ґрунтується на даних про символи, з яких цей пароль складений. Вага пароля обчислюється за наступною формулою:

(3.2)

де:

· pwlength рівне 5, якщо кількість символів в паролі більше 5, або рівно довжині пароля;

· numeric рівне 3, якщо кількість цифр в паролі більше 3, інакше - рівно кількості цифр;

· numsymbols вважається рівним 3, якщо число символів в паролі, відмінних від букв, цифр і знаків підкреслення, більше 3, інакше - кількості таких символів;

· upper рівне 3, якщо кількість букв у верхньому регістрі більше 3, або кількості заголовних букв в іншому випадку.

Після обчислення вага пароля нормується так, щоб його значення полягало в інтервалі від 0 до 100. Нормування проводиться у тому випадку, коли значення ваги не потрапляє в цей діапазон. У разі, коли pwstrength менше 0, значення pwstrength прирівнюють до нуля, а коли більше 0, значення ваги встановлюють рівним 100. Ранжирування ж пароля по ступеню стійкості залишене на розсуд розробників.

Описаний аналізатор не використовує ніяких перевірок з використанням словників, що робить його оцінки дещо однобокими, і, ймовірно, менш точними.

Password Strength Meter (jQuery plugin)

Ще одним варіантом оцінювача пароля, що працює на клієнтській стороні, є Password Strength Meter - плагін, розроблений для JavaScript фреймворку jQuery.

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

Розглянемо повний алгоритм процедури оцінки пароля:

1. Вага пароля встановлюється рівною нулю.

2. Якщо довжина пароля менше 4 символів, то робота алгоритму закінчується і повертається результат «дуже короткий пароль». Інакше переходимо до кроку 3.

3. Вагу пароля збільшуємо на величину - довжину пароля.

4. Здійснюється спроба стиснення пароля по наступному алгоритму. Якщо в паролі зустрічається підрядок виду SS, де S - рядок довжини 1, то перша частина цього підрядка видаляється і стиснення продовжується з позиції початку другій частині цього підрядка. Наприклад, застосовуючи цей алгоритм до рядка aaabbcab, на виході одержимо рядок abcab. Після виконання операції стиснення вага пароля зменшується на величину len - lenCompress - довжину пароля після стиснення.

5. Проводяться спроби стиснення пароля для випадків рядків S довжиною 2, 3 і 4 символів. Вага пароля зменшується аналогічно на величину len - lenCompress.

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

6. Якщо пароль містить не менше 3 цифр, то збільшити вагу на 5.

7. Якщо пароль містить не менше 2 знаків, то збільшити вагу на 5.

8. Якщо пароль містить букви, як у верхньому, так і в нижньому регістрах, то збільшити вагу пароля на 10.

9. Якщо пароль містить букви і цифри, то збільшити вагу пароля на 15.

10. Якщо пароль містить знаки і цифри, то збільшити вагу на 15.

11. Якщо пароль містить букви і знаки, то збільшити вагу на 15.

12. Якщо пароль складається тільки з букв або тільки з цифр, то зменшити вагу пароля на 10.

13. Якщо вага пароля менше 0, то встановити його рівним 0. Якщо більше 100, то встановити рівним 100.

14. Пароль, вага якого менше 34, визнається «слабким». Якщо вага від 34 до 67, то пароль відноситься до категорії «добрий», а якщо більше 67, то пароль вважається «відмінним».

Cornell University - Password Strength Checker

Офіційний алгоритм, що надається центром безпеки Корнельського університету (Ітака, США). З його допомогою користувачі можуть перевірити свій пароль, заповнивши web-форму і відправивши його на перевірку. Оцінка пароля, як і у випадку з сервісом Google, проводиться на стороні сервера.

Реалізація алгоритму не розкрита для загального доступу, проте в описі сервісу вказані вимоги, яким повинен задовольняти пароль, щоб перевірка пройшла успішно:

1. Пароль повинен мати довжину не менше 8 символів.

2. При складанні пароля використовуються символи, принаймні, трьох алфавітів з наступного списку:

· заголовні латинські букви;

· рядкові латинські букви;

· цифри;

· спеціальні знаки (такі як! * (): |);

3. Пароль не повинен містити слів із словника.

4. Пароль не повинен містити послідовностей букв (наприклад, ААА), що повторюються, і послідовностей виду abc, qwerty, 123, 321.

Ці вимоги повинні строго виконуватися. Якщо хоч би якась вимога не виконується, то пароль визнається ненадійним.

Password Strength Tester

JavaScript аналізатор паролів, який розробляється і підтримується в рамках проекту Rumkin.com.

Алгоритм оцінки, реалізований в даному аналізаторі, ґрунтується на загальних положеннях теорії інформації. Як основна оцінка пароля використовується його ентропія, обчислення якої проводиться з використання таблиць діаграм для англійської мови.

Під ентропією (інформаційною місткістю) пароля розуміється міра випадковості вибору послідовності символів, що становлять пароль, оцінена методами теорії інформації.

Інформаційна місткість E вимірюється в бітах і характеризує стійкість до підбору пароля методом повного перебору за умови відсутності апріорної інформації про характер пароля і застосування зловмисником оптимальної стратегії перебору, при якій середня очікувана кількість спроб до настання вдалої дорівнює . За твердженням автора цього оцінювача, з метою зменшення завантажуваного на клієнтську сторону об'єму інформації всі небуквені символи були об'єднані в одну групу. Ця група виступає якимсь універсальним символом, який і використовується в частотній таблиці.

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

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

Таблиця 3.4. Залежність рівня стійкості пароля від значення ентропії

Ентропія

Рівень стійкості

Коментар

< 28 біт

Дуже слабкий

Допустимо захищати тільки не цінну інформацію

28-35 біт

Слабкий

Здатний зупинити велике число зломщиків, ідеально підходить для використання в якості desktop-паролю

36-59 біт

Середній

Цілком придатний для комп'ютерів в корпо-ративній мережі

60-127 біт

Високий

Може бути використаний, щоб охороняти фінансову інформацію

> 128 біт

Наднадійний

Пароль володіє дуже великою стійкістю до підбору.

У плагіні Password Strength Meter для jQuery при оцінці здійснюється виявлення паролів побудованих шляхом повторення груп символів. Особливо слід зазначити проект Password Strength Tester, в якому використовується математична модель, побудована на основі положень теорії інформації.

Необхідно сказати, що в розглянутих програмних рішеннях існують ряд проблем, що не дозволяють рахувати оцінку рівня надійності пароля повною. Так on-line аналізатори, реалізовані засобами сценаріїв JavaScript, що виконуються на клієнтській стороні, обмежені в своїх ресурсах, що виключає можливість здійснювати перевірку по словниках великих об'ємів. У теж час варіант перевірки пароля на стороні сервера хоч і вирішує проблему використання словників, проте залишає відкритим питання про надійність передачі і, головне, захищеності оцінюваного пароля від несанкціонованого використання. У останньому випадку користувач може сподіватися лише на те, що обробку пароля проводить сервер, що виконує лише «чисті» операції, а не використовується в якості постачальника інформації для зловмисників.

Окрім цього, слід зазначити, що всі розглянуті програмні продукти не підтримують оцінку паролів, що містять букви кирилиці.

Алгоритм оцінки стійкості пароля від Microsoft

Аналіз коду показав, що алгоритм використовує два аналізатори стійкості пароля - основні, достатньо спрощені, і допоміжний - глибший.

Почнемо з поточного алгоритму, по якому аналізатор працює в черговому режимі.

1. Рівень стійкості пароля дається в діапазоні [0; 4] залежно від обчислюваної «бітової стійкості» bits.

· bits ? 128 - 4;

· 128 > bits ? 64 - 3;

· 64 > bits ? 56 - 2;

· bits < 56 - 1;

· порожній пароль - 0.

2. Для оцінки «бітової стійкості» використовується формула (3.3).

(3.3)

де:

· bits - бітова стійкість;

· log - натуральний логарифм;

· length - довжина пароля;

· charset - сумарний розмір множин для кожного з типів нижче, якщо вони присутні в рядку.

1. Малі англійські букви [abcdefghijklmnopqrstuvwxyz].

2. Заголовні англійські букви [A-Z].

3. Спеціальні символи [~`!@#$%^&*()-_+=»].

4. Цифри [1234567890].

5. Решта символів.

Розглянемо алгоритм роботи допоміжного аналізатора.

Для аналізу стійкості використовуються наступні показники:

· довжина пароля;

· кількість використовуваних типів символів: заголовні латинські, малі латинські, цифри, спеціальні символи;

· відсутність слова в словнику (слова завдовжки від 3 до 16 символів) з урахуванням подібності символів;

· близькість слова до словарного слова з певною вірогідністю.

Стійкість пароля підрозділяється на п'ять класів:

1. Відмінний (Best).

· довжина пароля - не менше 14;

· кількість використовуваних різних типів символів - не менше 3;

· у словнику відсутньо близьке з вірогідністю 0.6 слово з урахуванням подібності символів.

2. Стійкий (Strong).

· довжина пароля - не менше 8;

· кількість використовуваних різних типів символів - не менше 3;

· у словнику відсутньо близьке з вірогідністю 0.6 слово з урахуванням подібності символів.

3. Середній (Medium).

· довжина пароля - не менше 8;

· кількість використовуваних різних типів символів - не менше 2;

· слово відсутнє в словнику з урахуванням подібності символів;

4. Слабкий (Weak).

· пароль складається як мінімум з одного довільного символу.

5. Ніякий.

· вся решта паролів.

4. Опис функціональних можливостей та програмної реалізації проектованої системи

4.1 Функціональне призначення та технологічні особливості розробки

Паролі є найбільш поширеним інструментом, використовуваним для отримання доступу до інформаційних ресурсів. Для користувачів це один з найзручніших варіантів, який, до того ж, не вимагає наявність якого-небудь додаткового устаткування або спеціальних навиків.

Метою роботи є дослідження алгоритмів генерації та оцінки стійкості паролів. Розроблена система призначена для генерації криптостійких паролів з використанням двох алгоритмів - на основі псевдовипадкової послідовності та ключової фрази. Також розроблена система дозволяє визначити вагу стійкості пароля на основі алгоритму Password Strength Meter.

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

Для роботи системи необхідно: IBM-сумісний комп'ютер, не нижче Pentium - IІ, з ОЗУ рівним 128 Мб, з SVGA - відеоадаптером і монітором 15 дюймів.

Система генерації та оцінки стійкості паролів була створена за допомогою середовища прискореної розробки програмного забезпечення Delphi. При розробці інтерфейсу користувача були використані компоненти пакету AlphaControls 2010.

Склад розробленої системи:

· password.exe - виконавчий файл системи;

· my.ini - ini-файл, що містить інформацію про поточні налаштування системи;

· NextAlpha.asz - skin-файл інтерфейсу системи;

· help.hlp - файл довідки.

4.2 Розробка логіко-функціональної схеми роботи користувача з системою

На рис. 4.1 наведена логіко-функціональна схема роботи користувача з системою.

Рис. 4.1 Логіко-функціональна схема роботи користувача з системою

4.3 Опис інтерфейсу користувача

Після запуску на екрані з'являється головне вікно системи (рис. 4.2). По-перше, необхідно визначити довжину пароля, що буде згенерований. Значення за умовчанням завантажується з ini-файлу системи, мінімальна довжина паролю - 4 символи.

Рис. 4.2 Робоче вікно системи

Також необхідно визначити набір символів, які будуть включені в пароль. Це можуть бути заголовні та рядкові латинські букви, цифри або спеціальні символи. При установці прапорця «Символы», на екрані з'явиться додаткове вікно (рис. 4.3), де користувач може додати або видалити символи, які міститиме згенерований пароль.

Рис. 4.3 Вибір, додавання або видалення символів

Якщо вибраний варіант генерації на основі псевдовипадкових послідовностей, ми відразу ж натискаємо кнопку «Генерировать» і одержуємо необхідний пароль. Якщо він нас не влаштовує, натискаємо кнопку ще раз і одержуємо інші варіанти. Після цього одержаний пароль ми можемо скопіювати в буфер обміну і використовувати за призначенням.

Кнопка «Оценить стойкость» дозволяє по описаному нами надалі алгоритму на основі методу Password Strength Meter оцінити вагу стійкості паролю і його категорію. Візуальний індикатор, що відображається в лівій частині панелі приймає зелений колір, якщо пароль відмінний, жовтий, якщо пароль хороший, і червоний, якщо пароль слабкий. Також ми можемо ввести свій власний пароль і оцінити згідно вказаному алгоритму його стійкість.

Розглянемо генерацію пароля на основі введення ключової фрази. Після установки цього прапорця стає доступним поле введення ключової фрази і вибору алгоритму. Усі три алгоритми є різновидами спеціально розробленого алгоритму шифрування.

Символи, які містить ключова фраза можуть бути довільними. Але ключ, на основі якого буде згенерований пароль містить лише латинські та кириличні літери, або цифри. Інші цифри будуть видалені. Також не має різниці в регістрі, великі та маленькі літери у фразі будуть сприйматися однаково.

Обравши відповідний алгоритм, тиснемо кнопку «Генерировать» та отримаємо необхідний пароль.

Також в системі передбачена довідка, побачити яку ми зможемо натиснувши відповідну кнопку в головному вікні. Довідка зберігається в форматі hlp, вікно довідкової системи має вигляд, наведений на рис. 4.4.

Довідка про систему містить основні відомості про засоби її використання, алгоритми генерації та оцінки стійкості паролів, які були використані, а також відомості про автора.

Таким чином, ми одержуємо криптростійкий, практично непіддатливої злому пароль, що не потребує запам'ятовування. У будь-який момент, коли він нам знадобиться, ми використовуючи нашу систему, зможемо легко його відновити.

Рис. 4.4 Вікно довідкової системи

4.4 Розробка алгоритмів та програмна реалізація системи

При створені головного вікна системи зчитуємо дані з ini-файлу та формуємо змінні-послідовності символів.

procedure TForm1. FormCreate (Sender: TObject);

var i:integer;

begin

randomize; // ініціалізуємо генератор псевдовипадкових чисел

ini:= TIniFile. Create (ExtractFilePath(ParamStr(0)) + 'my.ini'); // створюємо посилання на ini-файл

znak:=ini. ReadString ('nabor', 'znaki', '!@#$%^&*-/?.,_+:;\|) ([]~'); // зчитуємо з ini-файлу множину спеціальних знаків, що будуть використовуватися при генерації паролю

sSpinEdit1. Value:=ini.readinteger ('dlina_pas', 'len', 10); // зчитуємо довжину паролю

ini. Free;

for i:=65 to 90 do // формуємо множину великих латинських літер

insert (char(i), eng_big, i-64);

for i:=97 to 122 do // формуємо множину маленьких латинських літер

insert (char(i), eng_small, i-96);

for i:=192 to 223 do // формуємо множину великих кириличних літер

insert (char(i), rus_big, i-191);

for i:=224 to 255 do // формуємо множину маленьких кириличних літер

insert (char(i), rus_small, i-223);

cifra:='0123456789'; // формуємо множину цифор

end;

При закритті програми зберігаємо дані в ini-файлі.

procedure TForm1. FormDestroy (Sender: TObject);

begin

ini:= TIniFile. Create (ExtractFilePath(ParamStr(0)) + 'my.ini');

ini. WriteString ('nabor', 'znaki', znak); // записуємо поточну послідовність спеціальних знаків

ini. WriteInteger ('dlina_pas', 'len', sSpinEdit1. Value); // записуємо довжину паролю

ini. Free;

end;

Система дозволяє користувачеві дозвільно формувати послідовність спеціальність знаків. Процедура, що відбувається при виборі відповідного перемикача.

procedure TForm1.sCheckBox4Click (Sender: TObject);

begin

if sCheckBox4. Checked then znaki. ShowModal // на екрані з'являється вікно формування послідовності символів

end;

Після натиснення кнопки «ОК» послідовність зберігається у відповідній змінній.

procedure Tznaki.but_closeClick (Sender: TObject);

begin

znak:=sEdit1. Text; // змінна, що містить текст послідовності спеціальних символів

close

end;

Процедура генерації паролів на основі псевдовипадкових послідовностей відбувається на основі наступного алгоритму.

Рис. 4.5 Алгоритм генерації паролю на основі псевдовипадкової послідовності

Якщо не заданий набір символів, на основі яких буде згенерований пароль, робота процедури завершується. Далі визначаємо довжину пароля. Цикл виконуватиметься, поки не будуть згенеровані всі символи пароля. Потім ми випадковим чином визначаємо номер групи символів. Якщо 1 - це великі латинські букви, 2 - маленькі латинські букви, 3 - цифри, 4 - спеціальні символи.

Далі ми перевіряємо, якщо заголовні букви включені в набір, то генеруємо випадковим чином код заголовного латинського символу. Після цього перетворюваний код в символ. Аналогічно поступаємо з іншими групами символів. Після цього лічильник символів збільшується на одиницю і відбувається вставка символу в рядок пароля. Далі повертаємося в початок циклу. Після його завершення виводимо рядок пароля на екран.

Далі наведений програмний код, що дозволяє реалізувати цей алгоритм.

if not sCheckBox5. Checked then // якщо не обраний режим генерації на основі ключової фрази

begin

if not (sCheckBox1. Checked) or (sCheckBox2. Checked) or (sCheckBox3. Checked) or (sCheckBox4. Checked) then // якщо не заданий набір символів виводимо відповідне повідомлення та завершуємо роботу процедури

begin

Label1. Visible:=true; Label1. Caption:='Не задан набор символов';

exit;

end;

len:=sSpinEdit1. Value; // визначаємо довжину паролю

pas:=''; // змінна, що зберігає пароль

i:=0;

while i<=len do begin // цикл виконується, доки не будуть згенеровані всі символи паролю

n:=random(3)+1; // випадковим чином визначаємо номер групи символів

i:=i+1;

case n of

1: // великі латинські літери

if sCheckBox1. Checked then begin // якщо відповідний прапорець обраний

a:=random (90-65)+65; // генеруємо випадковим чином код літери

ch:=char(a); // перетворюємо код в символ

end;

2: // маленькі латинські літери

if sCheckBox2. Checked then

begin

a:=random (122-97)+97;

ch:=char(a);

end;

3:// цифри

if sCheckBox3. Checked then

begin

a:=random (57-48)+48;

ch:=char(a);

end;

4: // спеціальні знаки

if sCheckBox4. Checked then

begin

a:=random (24-1)+1; // випадковим чином генеруємо порядковий номер знаку в масиві символів

ch:=znak[a]; // привласнюємо буферній змінній знак

end;

else i:=i-1;

end;

insert (ch, pas, i); // вставляємо в строку паролю у відповідній позиції згенерований символ

end;

Edit1. Text:=pas; // виводимо згенерований пароль у відповідне текстове поле

end;

end;

Для генерації паролю на основі випадкової фрази був розроблений наступний алгоритм.

Рис. 4.6 Алгоритм генерації паролю на основі ключової фрази

Наведемо алгоритм однієї ї з процедур - заміни символу шифру на велику латинську букву.

Рис. 4.7 Алгоритм процедури заміни символу шифру на велику латинську букву

Розглянемо цей алгоритм генерації паролю на основі ключової фрази. Спершу видаляємо з ключової фрази всі символи окрім букв і цифр. Якщо довжина ключової фрази менше ніж довжина пароля (цей варіант не рекомендується, проте допустимий) доповнюємо фразу маленькими буквами з російського алфавіту. Знаходимо цілу частину від ділення довжини ключа на довжину пароля і залишок від ділення довжини ключа на довжину пароля. Приступаємо до процедури генерації шифру. Схема створення шифру на основі ключа наведена на рис. 4.8.

Рис. 4.8 Схема створення шифру на основі ключа

Припустимо, після видалення непотрібних символів ми одержали наступний ключ (рис. 4.8). У шифр будуть включені символи, починаючи із значення змінної b з кроком, який рівний змінній а. У результаті одержимо рядок шифру, який містить таку ж кількість символів, як і необхідна довжина пароля.

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

Розглянемо алгоритм на прикладі заміни символу шифру на велику латинську букву. Спочатку ми перевіряємо, чи включені великі букви в набір, якщо ні, то виходимо з процедури. Потім ми перевіряємо букву шифру, якщо символ шифру - кирилична буква, то знаходимо номер цієї букви в російському алфавіті. Так само поступаємо з англійськими буквами і цифрами.

Потім визначаємо номер символу в англійському алфавіті і вставляємо велику англійську букву в пароль.

Наступний фрагмент коду реалізує наведені вище алгоритми.

else // якщо обраний режим генерації паролю на основі ключової фрази

begin

if sEdit1. Text='' then // якщо не задана ключова фраза для генерації паролю

begin

Label1. Visible:=true;

Label1. Caption:='Для генерации пароля введите ключевую фразу!';

exit; // завершення процедури

end;

kluch:=sEdit1. Text; // текст ключової фрази

for i:=1 to length(kluch) do // видаляємо із ключової фрази усі символи окрім літер або цифр

if not (kluch[i] in ['A'..'Z', 'a'..'z', 'А'..'Я', 'а'..'я', '0'..'9']) then delete (kluch, i, 1);

j:=0; len_kl:=length(kluch); // довжина ключової фрази

if len_kl<len then // якщо довжина ключової фрази менш ніж довжина паролю, що генерується, доповнюємо фразу маленькими літерами російської абетки

for i:=len_kl+1 to len do

begin

j:=j+1;

insert (rus_small[j], kluch, i);

end;

len_kl:=length(kluch);

a:=len_kl div len; // ціла частина від ділення довжини ключової фрази на довжину паролю

b:=(len_kl mod len)+1; // залишок від ділення довжини ключової фрази на довжину паролю

i:=b; shifr:=''; j:=0;

while j<=len do // створюємо шифр на основі ключової фрази

begin

j:=j+1;

insert (kluch[i], shifr, j);

i:=i+a;

end;

shifr:=Ansiuppercase(shifr); // переводимо рядок шифру до верхнього регістру

if sRadioGroup1. ItemIndex=0 then // якщо обраний перший алгоритм

begin

k:=0; i:=1; pas:='';

while i<=len do // цикл продовжується, доки не буде згенеровані всі символи паролю

begin

k:=k+1;

z:=k mod 4; // визначаємо, символ з якої групи буде виводитися

case z of

3: if sCheckBox1. Checked then // великі латинські літери

begin

if (ord (shifr[i])>=192) and (ord (shifr[i])<=223) then // якщо літера шифру кирилицею

for j:=1 to length (rus_big) do // перебираємо усі літери алфавіту

if shifr[i]=rus_big[j] then n:=j; // шукаємо номер цієї літери за абеткою

if (ord (shifr[i])>=65) and (ord (shifr[i])<=122) then // якщо літера шифру латиницею

for j:=1 to length (eng_big) do

if shifr[i]=eng_big[j] then n:=j;

if (ord (shifr[i])>=48) and (ord (shifr[i])<=57) then // якщо символ в шифрі є цифрою

for j:=1 to 10 do // перебираємо усі цифри

if shifr[i]=cifra[j] then n:=j; // знаходимо номер відповідної

if n>26 then // якщо номер символу більше, ніж літер в англійської абетці

n:=32-n+1;

n:=length (eng_big) - n+1; // визначаємо номер літери, яка буде включена в пароль в англійській абетці

insert (eng_big[n], pas, i); // вставляємо відповідний символ в рядок паролю

i:=i+1; // перехід до наступного символу паролю

end;

2: if sCheckBox2. Checked then // великі латиньські літери

begin

if (ord (shifr[i])>=192) and (ord (shifr[i])<=223) then // якщо літера шифру кирилицею

for j:=1 to length (rus_big) do

if shifr[i]=rus_big[j] then n:=j;

if (ord (shifr[i])>=65) and (ord (shifr[i])<=122) then // якщо літера шифру латиницею

for j:=1 to length (eng_big) do

if shifr[i]=eng_big[j] then n:=j;

if (ord (shifr[i])>=48) and (ord (shifr[i])<=57) then // якщо символ в шифрі є цифрою

for j:=1 to 10 do

if shifr[i]=cifra[j] then n:=j;

if n>26 then // якщо номер символу більше, ніж літер в англійської абетці

n:=32-n+1;

n:=length (eng_small) - n+1;

insert (eng_small[n], pas, i);

i:=i+1; // перехід до наступного символу паролю

end;

1: if sCheckBox3. Checked then // цифри

begin

if (ord (shifr[i])>=192) and (ord (shifr[i])<=223) then // якщо літера шифру кирилицею

for j:=1 to length (rus_big) do

if shifr[i]=rus_big[j] then n:=j;

if (ord (shifr[i])>=65) and (ord (shifr[i])<=122) then // якщо літера шифру латиницею

for j:=1 to length (eng_big) do

if shifr[i]=eng_big[j] then n:=j;

if (ord (shifr[i])>=48) and (ord (shifr[i])<=57) then // якщо символ в шифрі є цифрою

for j:=1 to 10 do

if shifr[i]=cifra[j] then n:=j;

n:=n mod 10// визначаємо номер цифри в масиві, що буде використана для підстановки

insert (cifra[n+1], pas, i);

i:=i+1; // перехід до наступного символу паролю

end;

0: if sCheckBox4. Checked then // спеціальні символи

begin

znak:='!@#$%^&*-/?.,_+:;\|) ([]~'; // задаємо фіксований рядок символів

if (ord (shifr[i])>=192) and (ord (shifr[i])<=223) then // якщо літера шифру кирилицею

for j:=1 to length (rus_big) do

if shifr[i]=rus_big[j] then n:=j;

if (ord (shifr[i])>=65) and (ord (shifr[i])<=122) then // якщо літера шифру латиницею

for j:=1 to length (eng_big) do

if shifr[i]=eng_big[j] then n:=j;

if (ord (shifr[i])>=48) and (ord (shifr[i])<=57) then // якщо символ в шифрі є цифрою

for j:=1 to 10 do

if shifr[i]=cifra[j] then n:=j;

if n>24 then // якщо номер перевищує кількість символів в фіксованому масиві

n:=32-n+1; n:=24-n+1;

insert (znak[n], pas, i); i:=i+1;

end;

end; // кінець структури case

end; // кінець циклу

end; // кінець програмної реалізації першого алгоритму.

if sRadioGroup1. ItemIndex=1 then // програмна реалізація другого алгоритму

begin

end;

if sRadioGroup1. ItemIndex=1 then // програмна реалізація третьго алгоритму

begin

end;

Розглянемо алгоритм процедури оцінки стійкості пароля. На початковому етапі вага пароля встановлюється рівною нулю. Якщо довжина пароля менше 4 символів, то повертається результат «дуже короткий пароль» і робота алгоритму закінчується.

На наступному кроці вагу пароля збільшуємо на величину , де - довжина пароля. На подальших етапах вагу пароля визначає набір символів, з яких він складається. Наприклад, якщо пароль містить не менше 3 цифр, то вага збільшується на 5 одиниць, якщо пароль містить букви, як у верхньому, так і в нижньому регістрах, то вага пароля збільшується на 10.

Далі виконується процедура стиснення пароля, яка полягає у видаленні символів, що повторюються. Алгоритм процедури наведений на рис. 4.9.

Після виконання операції стиснення вага пароля зменшується на величину len-lenCompress, де len - довжина пароля, а lenCompress - довжина пароля після стиснення. Пароль, вага якого менше 34, визнається «слабким». Якщо вага від 34 до 67, то пароль відноситься до категорії «добрий», а якщо більше 67, то пароль вважається «відмінним».

Рис. 4.9 Алгоритм оцінки стійкості паролю на основі методу Password Strength Meter

Рис. 4.10 Алгоритм процедури стиснення паролю

Наступний код демонструє реалізацію процедури оцінки стійкості паролів.

if length(pas)<4 then // якщо довжина пароля менш ніж 4 символа

begin

Label1. Caption:='Слишком короткий пароль!'

exit; // процедура завершується

end;

ves:=0; // початкове значення ваги паролю

ves:=ves+length(pas)*4;

 // якщо пароль містить не менше 3 цифр, то вага збільшується на 5 одиниць

k:=0; // лічильник кількості цифр

for i:=1 to length(pas) do // перебираємо в циклі усі символи паролю

if (pas[i] in ['0'..'9']) then // якщо символ є цифрою

k:=k+1; // рахуємо кількість цифр

if k>=3 then ves:=ves+5; // збільшуємо вагу паролю

k:=0;

 // якщо пароль містить не менш 2 знаків, то вага збільшується на 5 одиниць

for i:=1 to length(pas) do

if (pas[i] in ('!', '@', '#', '$', ' % ', '^', '&', '*', '+', '-

', '/', '?', '.', ',', '_', '+', ':', ';', '\', '|', ')', ' (', ' [', ']', '~',#32]) // множина, що містить спеціальні символи

then

k:=k+1;

if k>=2 then ves:=ves+5;

k:=0; m:=0;

 // якщо пароль містить букви в верхньому та нижньому регістрах, то вага збільшується на 10 одиниць

for i:=1 to length(pas) do

begin

if (ord (pas[i])>=65) and (ord (pas[i])<=90) then // якщо символ є латинською літерою в верхньому регістрі

k:=k+1;

if (ord (pas[i])>=97) and (ord (pas[i])<=122) then // якщо символ є латинською літерою в нижньому регістрі

m:=m+1;

end;

if (k<>0) and (m<>0) then ves:=ves+10;

 // пароль містить букви та цифри, то вага збільшується на 15 одиниць

k:=0; m:=0;

for i:=1 to length(pas) do

begin

if (ord (pas[i])>=65) and (ord (pas[i])<=90) or (ord (pas[i])>=97) and (ord (pas[i])<=122) then // якщо символ є літерою

k:=k+1;

if (pas[i] in ['0'..'9']) then // якщо символ є цифрою

m:=m+1;

end;

if (k<>0) and (m<>0) then ves:=ves+15;

 // якщо пароль містить знаки та цифри, то вага збільшується на 15 одиниць

k:=0; m:=0;

for i:=1 to length(pas) do

begin

if (pas[i] in ('!', '@', '#', '$', ' % ', '^', '&', '*', '+', '-'

'/', '?', '.', ',', '_', '+', ':', ';', '\', '|', ')', ' (', ' [', ']', '~',#32]) // множина спеціальних символів

then

k:=k+1;

if (pas[i] in ['0'..'9']) then // якщо символ є цифрою

m:=m+1;

end;

if (k<>0) and (m<>0) then ves:=ves+15;

 // якщо пароль містить спеціальні знаки та букви, то вага збільшується на 15 одиниць

k:=0; m:=0;

for i:=1 to length(pas) do

begin

if (pas[i] in ('!', '@', '#', '$', ' % ', '^', '&', '*', '+', '-'

'/', '?', '.', ',', '_', '+', ':', ';', '\', '|', ')', ' (', ' [', ']', '~',#32]) // множина спеціальних символів

then

k:=k+1;

if (ord (pas[i])>=65) and (ord (pas[i])<=90) or (ord (pas[i])>=97) and (ord (pas[i])<=122) then // якщо символ є літерою

m:=m+1;

end;

if (k<>0) and (m<>0) then ves:=ves+15;

 // якщо пароль містить тільки букви або цифри, вага паролю зменшується на 10 одиниць

k:=0; m:=0;

for i:=1 to length(pas) do

begin

if (ord (pas[i])>=65) and (ord (pas[i])<=90) or (ord (pas[i])>=97) and (ord (pas[i])<=122) then // якщо символ є літерою

k:=k+1;

if (pas[i] in ['0'..'9']) then // якщо символ є цифрою


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.