Автор работы: Пользователь скрыл имя, 13 Марта 2013 в 20:04, курсовая работа
Каждого пользователя разрабатываемая система должна опознавать по его имени (идентификатору). Если имя не введено, используем имя текущего пользователя компьютера. Проверка и хранение пароля для доступа пользователя к своим ключам для вариантов 1 и 2 не требуется (считаем, что система установлена на личном компьютере пользователя, и он контролирует доступ к компьютеру).
РЕФЕРАТ 3
ВВЕДЕНИЕ 5
1 ПОСТАНОВКА ЗАДАЧИ 6
2 ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 7
3 ОПИСАНИЕ ЛОГИКИ РАБОТЫ ОСНОВНЫХ БЛОКОВ ПРОГРАММЫ 13
4 РЕАЛИЗАЦИЯ ЗАДАЧИ 16
5 ИСХОДНЫЕ ТЕКСТЫ МОДУЛЕЙ 22
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 30
var
Provider: HCRYPTPROV; // криптопровайдер
PwdHash: string; // строка для хранения вычисленного хэша
b, p: boolean;
begin
// проверим есть ли в БД пользователь с таким логином
b:= UsersForm.UsersData.DataSet.
if b = true then // если есть пользователь с таким логином в бд, то покажем сообщение об ошибке
begin
MessageDlg('Пользователь с таким логином уже сушествует в БД! Выберите другой логин.', mtError, [mbOk], 1);
LoginEdt.Clear; // очистим поле ввода логина
LoginEdt.SetFocus; // установка курсора на поле для ввода логина
exit;
end;
p:= UsersForm.UsersData.DataSet.
// инициализация криптопровайдера
b:= CryptAcquireContext(@Provider, nil, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
if b = false then // если не удалось создать криптопровайдер
begin
MessageDlg('Не удалось создать криптопровайдер.', mtError, [mbOk], 1);
exit;
end;
PwdHash:= GetHash(PwdEdt.Text, Provider); // вычисляем хэш от введенного пароля
// формируем запрос для добавления добавления нового пользователя
QAddUser.Parameters.
QAddUser.Parameters.
QAddUser.Parameters.
QAddUser.ExecSQL;
CryptReleaseContext(Provider, 0); // разрушаем криптопровайдер
ModalResult:= MrOk; // закрываем окно
end;
procedure TCreateUserForm.LoginEdtChange
begin
// кнопка ОК будет включена, если длина введенного логина > 3,
// длина пароля не менее 8 символов, и подтверждение пароля совпадает с самим паролем
OkBtn.Enabled:= (LoginEdt.GetTextLen >= 3) and
(PWDEdt.GetTextLen >= MIN_PASSWORD_LENGTH) and
(PwdPromtEdt.Text = PwdEdt.text);
end;
end.
unit RegUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DB, ADODB, Buttons;
const
MAX_ERRORS = 3; // кол-во ошибок при регистрации, после которого программа завершается
ADMIN_KOD = 0; // код администратора
USER_KOD = 1; // код простого пользователя
UNKNOWN_KOD = -1; // код неизвестного пользователя
type
TRegForm = class(TForm)
OkBtn: TButton;
CancelBtn: TButton;
QueryGetInfo: TADOQuery;
LoginEdit: TLabeledEdit;
PwdEdit: TLabeledEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
……..
Button48: TButton;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
Button49: TButton;
Button50: TButton;
Button51: TButton;
procedure OkBtnClick(Sender: TObject);
procedure LoginEditChange(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button35Click(Sender: TObject);
procedure LoginEditKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure PwdEditKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure PwdEditKeyPress(Sender: TObject; var Key: Char);
procedure CheckBox1Click(Sender: TObject);
procedure CheckBox2Click(Sender: TObject);
// Кнопки экранной клавиатуры
procedure Button1Click(Sender: TObject);
…
procedure Button51Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
RegForm: TRegForm;
LoginErrors: integer; // счетчик кол-ва ошибок ввода пароля или логина
kod_prav: integer; // код прав пользователя
implementation
uses MainUnit, NewUserUnit, HashUnit, wcrypt2;
{$R *.dfm}
procedure TRegForm.LoginEditChange(
begin
// если длина введенного логина > 0, то кнопка "ОК" будет включена
OkBtn.Enabled:= LoginEdit.GetTextLen >= 3;
Button1.Enabled:= LoginEdit.GetTextLen >= 3;
end;
procedure increaseErrors;
begin
LoginErrors:= LoginErrors + 1; // увеличиваем счетчик кол-ва ошибок
if LoginErrors = MAX_ERRORS then // если число ошибок = 3, то программ завершается
begin
MessageDlg('Вы допустили 3 ошибки. Программа завершится.', mtError, [mbOk], 1);
Application.Terminate;
end;
end;
procedure AddToProtocol(login: string; // логин пользователя
d: TDateTime; // дата и время регистрации
status: integer; // статус регистрирующегося пользователя(админ, пользователь, неизвестен)
access: boolean); // результат регистрации: успех или отказ
var
f: TextFile; // файл, в котором введется протокол
s: string;
begin
// протокол будет распологаться в одном каталоге с программой
s:= 'protocol.log';
assignFile(f, s );
if not FileExists(s) then // если файл протокола не существует
rewrite(f) // то создаем его
else // иначе
append(f); // будем дописывать в сущемтвующий файл данные
writeln(f, DateTimeToStr(d)); // записывае дату и время регистрации
writeln(f, login); // записываем логин
case status of
ADMIN_KOD : s:= 'Админ';
USER_KOD : s:= 'Пользователь';
UNKNOWN_KOD : s:= 'Неизвестный';
end;
writeln(f, s); // записываем статус пользователя
if access = true then
s:= 'Успех'
else
s:= 'Отказ';
writeln(f, s); // строка, показчвающая успех или отказ во входе в систему
writeln(f,''); // добавляем пустую строку после записи
closeFile(f); // закроем файл протокола
end;
procedure TRegForm.OkBtnClick(Sender: TObject);
var
Provider: HCRYPTPROV; // криптопровайдер
b: boolean;
begin
label1.Caption:='Введите ваш логин (не менее 3 символов)';
pwdedit.Visible:=false;
loginedit.Visible:=true;
okbtn.Visible:=false;
Button1.Visible:=true;
// проверяем существует ли в БД пользователь с таким логином
QueryGetInfo.Close;
QueryGetInfo.Parameters.
QueryGetInfo.Open;
if QueryGetInfo.RecordCount=0 then // если в БД нет пользователя с таким логином, то ошибка
begin
// запишем в файл протокола информацию о попытке входа в систему с неверным логином
AddToProtocol(LoginEdit.Text,
now, // дата и время попытки регистрации
UNKNOWN_KOD, // код, означающий, что права пользователя не определены, так как такого пользователя нет в БД
false); // отметка, что попытка входа завершилась неудачей
increaseErrors; // увеличить счетчик кол-ва ошибок ввода пароля или логина
MessageDlg('Неверные данные! Повторите ввод', mtError, [mbOk], 1);
LoginEdit.Clear; // очистка поля для ввода логина
LoginEdit.SetFocus; // установка курсора на поле для ввода логина
Exit;
end;
// проверим верен ли пароль
// инициализация криптопровайдер
b:= CryptAcquireContext(@Provider, nil, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
if b = false then // если не удалось создать криптопровайдер
begin
MessageDlg('Не удалось создать криптопровайдер.', mtError, [mbOk], 1);
exit;
end;
// проверяем правильность пароля введенного пользователем
b:= GetHash(PwdEdit.Text, Provider) = QueryGetInfo.FieldByName('
CryptReleaseContext(Provider, 0); // разрушаем криптопровайдер
if b = false then // если неправилен, то
begin
// запишем в файл протокола информацию о попытке входа в систему с неверным паролем
AddToProtocol(LoginEdit.Text,
now, // дата и время попытки входа в систему
QueryGetInfo.FieldByName('kod_
false); // отметка, что попытка входа завершилась неудачей
increaseErrors; // увеличим счетчик кол-ва ошибок входа в систему
MessageDlg('Неверные данные! Повторите ввод', mtError, [mbOk], 1);
PwdEdit.Clear; // очистка поля для ввода пароля
exit;
end;
kod_prav:= QueryGetInfo.FieldByName('kod_
// запишем в файл протокола информацию об успешном входе в систему
AddToProtocol(LoginEdit.Text, now, kod_prav, true);
RegForm.ModalResult:= MrOk;
end;
procedure TRegForm.FormShow(Sender: TObject);
begin
LoginEdit.Clear; // очистим поле для логина
PwdEdit.Clear; // очистим поле для ввода пароля
LoginErrors:= 0; // в самом начале регистрации кол-во ошибок = 0
end;
procedure TRegForm.Button1Click(Sender: TObject);
begin
pwdedit.Clear; //очищаем поле ввода пароля
label1.Caption:='Введите пароль (не менее 8 символов)';
pwdedit.Visible:=true;
loginedit.Visible:=false;
okbtn.Visible:=true;
Button1.Visible:=false;
end;
procedure TRegForm.Button35Click(Sender: TObject);
begin
if button1.Visible=enabled then //если кнопка первого входа активна то
loginedit.Text:=loginedit.
PwdEdit.Text:=pwdedit.Text+
end;
procedure TRegForm.LoginEditKeyDown(
Shift: TShiftState);
begin
showmessage('Ввод с клавиатуры опасен, воспользуйтесь электронной клавиатурой');
end;
procedure TRegForm.PwdEditKeyDown(Sender
Shift: TShiftState);
begin
showmessage('Ввод с клавиатуры опасен, воспользуйтесь электронной клавиатурой');
end;
procedure TRegForm.PwdEditKeyPress(
begin
// PwdEdit.Clear;
end;
procedure TRegForm.CheckBox1Click(
begin
//Кнопка 1
if checkbox2.Checked then
if checkbox1.Checked then button35.Caption:='!'
else button35.Caption:='1'
else
if checkbox1.Checked then button35.Caption:='!'
else button35.Caption:='1' ;
//Кнопка 2
if checkbox2.Checked then
if checkbox1.Checked then button36.Caption:='@'
else button36.Caption:='2'
else
if checkbox1.Checked then button36.Caption:='"'
else button36.Caption:='2' ;
//Кнопка 3
if checkbox2.Checked then
if checkbox1.Checked then button37.Caption:='#'
else button37.Caption:='3'
else
if checkbox1.Checked then button37.Caption:='№'
else button37.Caption:='3' ;
end.
ЗАКЛЮЧЕНИЕ
В ходе выполнения курсовой работы изучен необходимый теоретический материал, приобретены практические навыки по проектированию и разработке системы парольной аутентификации.
В результате закреплены знания и навыки, приобретенные при изучении дисциплины «Информационная Безопасность» по разработке системы парольной аутентификации с использованием функций CryptoAPI на языке Delphi.
1 Фленов М.Е.,Библия Delphi 7.- БХВ-Петербург 2004. – 874 с.
2 Белоусов Ю. И., Моисеев В. С., Лепахин В. К. Клиническая фармакология и фармакотерапия, руководство для врачей — М.: Универсум, 1993. — 400 с.:ил.
3 Лыткина Л. И., Саяпин А. В. Интеллектуальные информационные системы, учебное пособие — Красноярск: СибГАУ, 2004. — 93с.
4 Рудакова Г. М. Представление знаний в информационных системах, курс лекций — Красноярск: СибГТУ, 2006. — 42с.
6Соколов А.В., Шаньгин В.Ф. Защита информации в распределенных корпоративных сетях и системах. М.: ДМК Пресс, 2002
7Аутентификация пользователей —
современные методы, http://offline.cio-world.ru/
Информация о работе Использование криптографического интерфейса приложений Cryptoapi