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