Защита
формы паролем
Логично,
что перед запуском формы, которую мы
хотим защитить, надо запросить у пользователя
пароль (можно конечно и комбинацию имя
пользователя - пароль, но мы рассмотрим
на примере только пароля) и сравнить
введенное значение с каким-то зарезервированным
в программе (оно может храниться как
в явном виде так и в зашифрованном).
Если значения совпадут, то мы откроем
необходимую форму, иначе завершим все
приложение.Теперь непосредственно займемся
разработкой формы запроса пароля. Вам
надо выбрать пункт меню File -> New,
в открывшемся диалоговом окне выберите
закладку Dialogs, щелкните на значке
Password Dialog и нажмите Ok. На экране
появится готовая форма запроса пароля
с именем PasswordDlg.На этой форме будут
две кнопки Ok и Cancel, текстовое поле
ввода пароля с именем Password, метка
Label1 с надписью Enter Password. Заменим
свойство Caption метки Label1 на более
приятное русскому глазу 'Введите пароль'.
Также поменяем свойство Caption и для
самой формы на 'Запрос пароля', например.
Обратите внимание на свойство PasswordChar
поля ввода Edit равно * (звездочке)
- это означает, что при вводе все символы
будут заменены на звездочки. Нам необходимо
добиться, чтобы форма запроса пароля
появлялась на экран раньше основной
формы. Это делается так. В обработчике
события OnShow главной формы нужно написать
такой код:
PasswordDlg.showmodal;
Этот код запустит
нашу форму запроса пароля (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 { Public declarations } 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;
Как Вы видите
поменялось совсем не много, теперь пароль
в зашифрованном виде можно хранить например
в каком-нибудь файле. Так что защищайте
Ваши формы :)
Вот
и всё. Если что не удалось - пишите.
|