Использование криптографического интерфейса приложений Cryptoapi

Автор работы: Пользователь скрыл имя, 13 Марта 2013 в 20:04, курсовая работа

Краткое описание

Каждого пользователя разрабатываемая система должна опознавать по его имени (идентификатору). Если имя не введено, используем имя текущего пользователя компьютера. Проверка и хранение пароля для доступа пользователя к своим ключам для вариантов 1 и 2 не требуется (считаем, что система установлена на личном компьютере пользователя, и он контролирует доступ к компьютеру).

Содержание

РЕФЕРАТ 3
ВВЕДЕНИЕ 5
1 ПОСТАНОВКА ЗАДАЧИ 6
2 ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 7
3 ОПИСАНИЕ ЛОГИКИ РАБОТЫ ОСНОВНЫХ БЛОКОВ ПРОГРАММЫ 13
4 РЕАЛИЗАЦИЯ ЗАДАЧИ 16
5 ИСХОДНЫЕ ТЕКСТЫ МОДУЛЕЙ 22
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 30

Прикрепленные файлы: 1 файл

курсовой.doc

— 1.29 Мб (Скачать документ)

var

  Provider: HCRYPTPROV;    // криптопровайдер

  PwdHash: string;         // строка для хранения вычисленного хэша

  b, p: boolean;

begin

 

  // проверим есть ли в БД пользователь с таким логином

  b:= UsersForm.UsersData.DataSet.Locate('Login', LoginEdt.Text, [loCaseInsensitive]);

 

  if b = true then     // если есть пользователь с таким логином в бд, то покажем сообщение об ошибке

  begin

    MessageDlg('Пользователь с таким логином уже сушествует в БД! Выберите другой логин.', mtError, [mbOk], 1);

    LoginEdt.Clear;        // очистим поле ввода логина

    LoginEdt.SetFocus;     // установка курсора на поле для ввода логина

    exit;

  end;

 

  p:= UsersForm.UsersData.DataSet.Locate('PWDHash', pwdedt.Text, [loCaseInsensitive]);

 

  //  инициализация криптопровайдера

  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.ParamByName('login').Value:= LoginEdt.Text; // логин создаваемого пользователя

  QAddUser.Parameters.ParamByName('hash').Value:= PwdHash;         // хэш от пароля

  QAddUser.Parameters.ParamByName('kod_prav').Value:=1;  //PravaBox.ItemIndex; // код прав пользователя

  QAddUser.ExecSQL;

 

  CryptReleaseContext(Provider, 0); // разрушаем криптопровайдер

  ModalResult:= MrOk;               // закрываем окно

end;

 

procedure TCreateUserForm.LoginEdtChange(Sender: TObject);

begin

  // кнопка ОК будет включена, если длина введенного логина > 3,

  // длина пароля не менее 8 символов, и подтверждение пароля совпадает с самим паролем

  OkBtn.Enabled:= (LoginEdt.GetTextLen >= 3) and

                  (PWDEdt.GetTextLen >= MIN_PASSWORD_LENGTH) and

                  (PwdPromtEdt.Text = PwdEdt.text);

end;

 

end.

5.2 Исходный текст модуля  URegForm.pas регистрации пользователя

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(Sender: TObject);

 

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.ParamByName('login').Value:= LoginEdit.Text;

  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('pwdhash').AsString;

 

  CryptReleaseContext(Provider, 0); // разрушаем криптопровайдер

 

  if b = false then // если неправилен, то

  begin

    // запишем в файл протокола информацию о попытке входа в систему с неверным паролем

    AddToProtocol(LoginEdit.Text,      // введенный логин

                  now,                // дата и время попытки входа в систему

                  QueryGetInfo.FieldByName('kod_prav').AsInteger,  // права пользователя, под логином которого хотели войти

                  false);             // отметка, что попытка входа завершилась неудачей

 

    increaseErrors; // увеличим счетчик кол-ва ошибок входа в систему

 

    MessageDlg('Неверные данные! Повторите ввод', mtError, [mbOk], 1);

    PwdEdit.Clear;       // очистка поля для ввода пароля

    exit;

  end;

 

  kod_prav:= QueryGetInfo.FieldByName('kod_prav').AsInteger;

 

  // запишем в файл протокола информацию об успешном входе в систему

  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.Text+button35.Caption else //вбиваем логин иначе

 PwdEdit.Text:=pwdedit.Text+button35.Caption;   //заполняем поле ввода пароля

end;

 

procedure TRegForm.LoginEditKeyDown(Sender: TObject; var Key: Word;

  Shift: TShiftState);

begin

  showmessage('Ввод с клавиатуры опасен, воспользуйтесь электронной клавиатурой');

end;

 

procedure TRegForm.PwdEditKeyDown(Sender: TObject; var Key: Word;

  Shift: TShiftState);

 

begin

 showmessage('Ввод с клавиатуры опасен, воспользуйтесь электронной клавиатурой');

end;

 

 

 

procedure TRegForm.PwdEditKeyPress(Sender: TObject; var Key: Char);

 

begin

//  PwdEdit.Clear;

end;

 

procedure TRegForm.CheckBox1Click(Sender: TObject);

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с.

  1. Владимир Гофман; Анатолий Хомоненко, Delphi. Быстрый старт – 327 с

6Соколов А.В., Шаньгин В.Ф. Защита информации в распределенных корпоративных сетях и системах. М.: ДМК Пресс, 2002

7Аутентификация пользователей — современные методы, http://offline.cio-world.ru/offline/2006/47/263991/

 

 

 

 

 


Информация о работе Использование криптографического интерфейса приложений Cryptoapi