Захист форми паролем - Делфі і хакер - статті по Делфі - персональний сайт

Захист форми паролем

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

Тепер безпосередньо займемося розробкою форми запиту пароля. Хоча розробляти нам нічого і не треба: найпростіший варіант такої форми Delphi поставляє. Вам треба вибрати пункт меню File -> New, в діалоговому вікні виберіть закладку Dialogs, клацніть на значку Password Dialog і натисніть Ok. На екрані з'явиться готова форма запиту пароля з ім'ям PasswordDlg.

На цій формі будуть дві кнопки Ok і Cancel, текстове поле введення пароля з ім'ям Password, мітка Label1 з написом Enter Password. Замінимо властивість Caption мітки Label1 на більш приємне українському оку 'Введіть пароль'. Також поміняємо властивість Caption і для самої форми на 'Запитувати пароль', наприклад.

Зверніть увагу на властивість PasswordChar поля введення Edit одно * (зірочці) - це означає, що при введенні все символи будуть замінені на зірочки.

Нам необхідно добитися, щоб форма запиту пароля з'являлася на екран раніше основної форми. Це робиться так. У обробнику події OnShow головною форми потрібно написати такий код:

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

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

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

procedure TPasswordDlg.FormCloseQuery (Sender: TObject;
var CanClose: Boolean);
const pass = 'велкам'; // наш праоль
begin
if Password.Text = pass then CanClose: = true
else Application.Terminate;
end;

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

if Password.Text = pass then CanClose: = true

треба замінити на:

if lowerCase (Password.Text) = lowerCase (pass) then CanClose: = true

Тепер спробуємо захистити форму паролем, який буде зберігатися в зашифрованому вигляді. Зашифруємо пароль найпростішим способом - Xor. Для цього напишемо свою функцію:

function TPasswordDlg.xortext (text: string): string;
var key, longkey. string;
i. integer;
toto: char;
begin
key: = 'da'; // ключ
for i: = 0 to (length (text) div length (key)) do
longkey: = longkey + key;
for i: = 1 to length (text) do begin
toto: = chr ((ord (text [i]) XOR ord (longkey [i])));
result: = result + toto;
end;
end;

Через своє ім'я функція буде повертати зашифровану рядок передану в параметрі Text. Не забудьте оголосити цю функцію в розділі Public:

public

function xortext (text: string): string;

Ось, наприклад, що вийде, якщо зашифрувати цією процедурою наш "велкам":

Тепер поміняємо обробник події onFormCloseQuery, описаний в першому приклад, на такий:

procedure TPasswordDlg.FormCloseQuery (Sender: TObject;
var CanClose: Boolean);
var pass: string;
begin
pass: = xortext ( 'велкам');

if xortext (Password.Text) = pass then CanClose: = true
else Application.Terminate;
end;

Як Ви бачите змінилося зовсім небагато, тепер пароль в зашифрованому вигляді можна зберігати наприклад в якомусь файлі. Так що захищайте Ваші форми :)

лоап, введи какойніть маркер того, що пароль був введений. Наприклад, є така властивість Tag, яке толком не несе ніякої корисної інформації.

замість "PasswordDlg.showmodal;" напиши щось на зразок

"If Tag = 0 then
begin
PasswordDlg.showmodal;
inc (Tag);
end; "

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