Захист форми паролем - Делфі і хакер - статті по Делфі - персональний сайт
Захист форми паролем
Ось вже друга заявка присвячена проблемі захисту форми паролем. Раз це викликає такий інтерес, сьогодні ми спробуємо розібратися з азами такого захисту. Давайте обговоримо як ми це будемо робити. Логічно, що перед запуском форми, яку ми хочемо захистити, треба запитати у користувача пароль (можна звичайно і комбінацію ім'я користувача - пароль, але ми розглянемо на прикладі тільки пароля) і порівняти введене значення з якимось зарезервованим в програмі (воно може зберігатися як в явному вигляді так і в зашифрованому). Якщо значення зійдуться, то ми відкриємо необхідну форму, інакше завершимо всі додаток.
Тепер безпосередньо займемося розробкою форми запиту пароля. Хоча розробляти нам нічого і не треба: найпростіший варіант такої форми 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 назад в нуль.