Вот уже вторая заявка посвящена проблеме защиты формы паролем. Раз это
вызывает такой интерес, сегодня мы попробуем разобраться с азами такой защиты.
Давайте обсудим как мы это будем делать. Логично, что перед запуском формы,
которую мы хотим защитить, надо запросить у пользователя пароль (можно конечно и
комбинацию имя пользователя - пароль, но мы рассмотрим на примере только пароля)
и сравнить введенное значение с каким-то зарезервированным в программе (оно
может храниться как в явном виде так и в зашифрованном). Если значения совпадут,
то мы откроем необходимую форму, иначе завершим все приложение.
Теперь непосредственно займемся разработкой формы запроса пароля. Хотя
разрабатывать нам ничего и не надо: самый простой вариант такой формы 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 и других попытках
закрыть форму запроса будем завершать наше приложение.
Для этого напишем обработчик для события 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;
Как Вы видите поменялось совсем не много, теперь пароль в зашифрованном виде
можно хранить например в каком-нибудь файле. Так что защищайте Ваши формы :)
|