Разработка программы, генерирующей пароли пользователей

Федеральное агентство по образованию

	Пензенский государственный университет

	

	Кафедра «Информационная безопасность систем и технологий»

	

	

	

	

	

	

	Пояснительная записка к курсовой работе

	по теме:

	«Разработка программы, генерирующей пароли пользователей»

	

	

	

	

	Дисциплина: Теоретические основы

	компьютерной безопасности

	Группа: 	 	 .

	Выполнил:

	Проект принят с оценкой:

		Руководитель проекта:			.

		

	

	

	

	

	

	Пенза, 2006г.

	
Реферат

	

	Пояснительная записка содержит 32 с., 2 рис., 4 источника, 4 прил.

	MICROSOFT VISUAL С++, ПРОГРАММА, ПАРОЛЬНАЯ СИСТЕМА, КОЛИЧЕСТВЕННАЯ ОЦЕНКА СТОЙКОСТИ ПАРОЛЯ.

	Объектом исследования является парольные системы.

	Целью работы является разработка программы, генерирующей пароли пользователей с учётом количественной оценки стойкости пароля.

	В процессе работы была произведена количественная оценка стойкости паролей пользователей и в соответствии с полученной оценкой была разработана программа, генерирующая пароли пользователей.

	В результате работы была разработана программа, генерирующая пароли пользователей (её текст приведён в приложении).

	
Содержание

			

			Реферат

			Задание

			Введение

			1. Количественная оценка стойкости пароля

			2. Интерфейс

			2.1 Понятие интерфейса и его назначение 

	2.2. Выбор интерфейса

	3. Разработка алгоритма программы

	4. Создание программы на базе разработанного алгоритма

			5. Экспериментальная проверка количественных оценок стойкости пароля

			6. Руководство пользователя

			Заключение

	Список использованных источников

	ПРИЛОЖЕНИЕ А. Алгоритм программы

	ПРИЛОЖЕНИЕ Б. Текст программы

	ПРИЛОЖЕНИЕ В. Random.cpp 

	ПРИЛОЖЕНИЕ Г. PassGenDlg.cpp

	
Введение

	

	Проблему компьютерной безопасности надуманной не назовешь. Практика показывает: чем более ценная информация доверяется компьютерам, тем больше находится желающих нарушить ее нормальное функционирование ради материальной выгоды или просто из праздного любопытства. Идет постоянная виртуальная война, в ходе которой организованности системных администраторов противостоит изобретательность компьютерных взломщиков.

	Основным защитным рубежом против злонамеренных атак является система парольной защиты, которая имеется во всех современных программных продуктах. В соответствии с установившейся практикой, перед началом сеанса работы с операционной системой пользователь обязан зарегистрироваться, сообщив ей свое имя и пароль. Имя требуется для идентификации пользователя, а пароль служит подтверждением правильности произведенной идентификации. Информация, введенная пользователем в диалоговом режиме, сравнивается с той, что имеется в распоряжении операционной системы. Если проверка дает положительный результат, то пользователю становятся доступны все ресурсы операционной системы, связанные с его именем.

	Несанкционированный доступ (Н.С.Д.) к информации - доступ к информации, нарушающий установленное правило разграничения доступа и осуществляемый с использованием нештатных средств, предоставляемых автоматизированной системой.

	Выделяют 2 типа методов защиты от Н.С.Д.:

	организационные меры - определяются документально.

	Технические меры - группа методов, которые реализуются программными, аппаратными и программно - аппаратными средствами.

	Существуют 3 группы методов аутентификации, которые основаны на обладании некоторого свойства или объекта

	обладание определённым объектом;

	основано на знании информации известной пользователю и проверяющей стороне;

	основано на том, что у каждого пользователя есть уникальные биометрические характеристики.

	Общие подходы к построению парольных систем.

	Способы:

	с использованием хранимой копии пароля;

	некоторое проверочное значение;

	парольная система без непосредственной передачи информации, о пароле проверяющей стороне;

	использование пароля для получения криптографического ключа.

	Идентификатор пользователя - некоторая уникальная информация, позволяющая различать индивидуальных пользователей парольной системы. Часто идентификатор пользователя называют именем пользователя. Пароль - некоторая секретная информация, которая известна только пользователю и парольной системе, которая предъявляется для прохождения процедуры идентификации.

	Учётная запись пользователя - совокупность его идентификатора и пароля. База данных пользователей парольной системы содержит учётные записи пользователей парольной системы. Под парольной системой понимается программно-аппаратный комплекс, реализующий идентификацию и аутен-тификацию пользователей автоматизированной системы на основе одноразовых и многоразовых паролей.

	Угрозы для парольной системы.

	разглашение параметров учётной записи

	а) подбор пароля;

	б) визуальное наблюдение;

	в) перехват пароля в сети.

	2. вмешательство в функционирование парольной системы

	а) использование программных закладок;

	б) выведение из строя парольной системы;

	в) использование ошибок и недоработок в парольной системе.

	Выбор паролей

	Требования к выбору паролей:

	

	требования к выбору пароля

	достигнутый результат

	ограничение минимальной длины

	1 усложняется подбор методом прямого перебора

	2 усложняется подсматривание

	Использование различных групп символов

	усложняется подбор методом прямого перебора

	проверка и отбраковка по словарю

	затруднение подбора пароля по словарю

	установление срока действия пароля

	усложняется подбор методом прямого перебора и подстановки старого

	ведение журнала историй пароля

	повышается эффективность предыдущего

	ограничение количества попыток ввода

	препятствует подбору пароля

	поддержка режима принудительной смены пароля

	увеличение эффекта выполнения требования касающегося смены пароля

	принцип смена пароля после 1-ой регистрации

	защита от злоумышленных действий администратора

	запрет на выбор пароля самим пользователем

	защита от выбора пользователем лёгкого пароля

	Задержка при вводе неправильного пароля

	затрудняется подбор пароля когда он вводится с клавиатуры непосредственно за компьютером

	

	
1. Количественная оценка стойкости пароля

	

	Параметр

	Способ определения

	“А”-мощность алфавита паролей

	L-длина пароля

	могут применяется для обеспечения требуемого значения S=AL

	“S”-мощность пространства паролей

	определяется на основе заданных значений P,T,V

	“V”-скорость подбора паролей

	скорость обработки 1-ой попытки регистрации

	“T”- срок действия пароля

	определяется из параметра Р.

	“P”- вероятность подбора пароля в течение срока его действия (подбор идёт неправильно в течение всего времени)

	выбирается заранее

	

	Произведём количественную оценку пароля при заданных параметрах:

	-вероятность подбора пароля Р-10-4;

	-период действия пароля Т, минут-30;

	-длина пароля L,	6 символов;

	-мощность алфавита паролей А – прописные и строчные латинские буквы и цифры от 0 до 9 т.е. 62 символов;

	Необходимо найти скорость подбора пароля.

	Для нахождения скорости подбора пароля воспользуемся формулой P=V*T/S, причем мощность пароля равна S=AL. Период действия выразим в секундах (Т=30 мин.* 60 сек. =1800 сек.). Таким образом получаем V=P*AL/T. Подставив значения получили V= 10-4*626/1800=3155 пар./сек.

	Подсчитав, мы получили величину скорости подбора пароля равную 3155 пар./сек.

	
2. Интерфейс

	

	2.1 Понятие интерфейса и его назначение

	

	Перед началом самого программирования и даже составления алгоритмов необходимо представить себе как будет работать программа и посредством этого выбрать интерфейс.

	Под интерфейсом понимают совокупность схемотехнических средств и правил, обеспечивающих непосредственное взаимодействие составных элементов вычислительной системы и или программ. Интерфейс обеспечивает взаимосвязь между функциональными блоками или устройствами системы.

	Основным назначением интерфейса является унификация внутрисистемных и межсистемных связей и устройств сопряжения с целью эффективной реализации прогрессивных методов проектирования функциональных элементов вычислительной системы.

	Системный подход при проектировании представляет собой комплексное, взаимосвязанное, пропорциональное рассмотрение всех факторов, путей и методов решения сложной многофакторной и многовариантной задачи проектирования интерфейса взаимодействия. В отличие от классического инженерно- технического проектирования при использовании системного подхода учитываются все факторы проектируемой системы - функциональные, психологические, социальные и даже эстетические.

	Автоматизация управления неизбежно влечёт за собой осуществление системного подхода, т.к. она предполагает наличие саморегулирующейся системы, обладающей входами, выходами и механизмом управления. Уже само понятие системы взаимодействия указывает на необходимость рассмотрения окружающей среды, в которой она должна функционировать.

	Таким образом, система взаимодействия должна рассматриваться как часть более обширной системы - АСУ реального времени, тогда как последняя - системы управляемой среды.

	В настоящее время можно считать доказанным, что главная задача проектирования интерфейса пользователя заключается не в том, чтобы рационально "вписать" человека в контур управления, а в том, чтобы, исходя из задач управления объектом, разработать систему взаимодействия двух равноправных партнёров (человек- оператор и аппаратно- программный комплекс АСУ), рационально управляющих объектом управления.

	

	2.2 Выбор интерфейса

	

	Интерфейс взаимодействия с пользователем является важным элементом любой программы. От его продуманности и удобства часто зависит коммерческий успех программного продукта.

	Интерфейс пользователя можно разделить на пакетный и интерактивные. Пакетные характеризуются тем, что пользователь должен сформировать пакет с заданиями, затем программа эти задания выполняет и выдаёт результат. Интерактивные характеризуются тем, что пользователь в ходе работы программы постоянно с ней взаимодействует. Существует интерфейс на базе меню, псевдографический интерфейс, интерактивно- командный интерфейс, эти интерфейсы описывать не будем, так как программа, которую необходимо создать по заданию требует графический интерфейс. Графический интерфейс следует выбирать только для многомодульных программ, которые, предположительно будут иметь массовое применение. В соответствии с заданием и для большего удобства и понятия принципа работы программы интерфейс должен содержать наименьшее количество кнопок. Вследствие чего выберем: 1 поле, в котором будем генерировать сам код, одну кнопку после нажатия, которой будет происходить генерация, и кнопку выход.

	Интерфейс приведен на рисунке 1.

	
3. Разработка алгоритма программы

	

	В данном разделе проводится разработка алгоритма работы программы, генерирующей пароли пользователей.

	Прежде чем начать разработку, вводим несколько ограничений:

	- программа должна исключать подбор пароля по словарю;

	- программа должна обеспечивать взаимодействие с пользователем посредством графического интерфейса;

	- процесс выполнения генерации паролей должен быть реализован в интегрированной среде разработки Microsoft Visual C++ v. 6.0.

	- символы не должны повторяться.

	После запуска программы и нажатия на клавишу “Генерировать код” должен генерироваться случайно первый символ из заранее созданного массива символов PassAlfavit[], после чего данный символ записывается в другой массив passwrd[]. Далее генерируется второй и происходит проверка, не повторяются ли символы. Если выполняется данное условие, то происходит удаление последнего символа, если же нет, то происходит запись в массив passwrd[] со следующим символом.

	Затем происходит проверка, не достигнута ли длина пароля, обеспечивающая его стойкость при заданных параметрах, в соответствии с заданием длина пароля будет равна 6 символам. После чего происходит присоединение символов в одно слово и происходит проверка на наличие сгенерированного пароля в словаре английских слов и аббревиатур, если данный пароль существует в словаре, то происходит его удаление и генерация начинается сначала.

	После завершения генерации пароля он должен быть выдан в специальном поле.

	Структурная схема алгоритма программы, генерирующей пароли пользователей, приведена в приложении А.

	
4. Создание программы на базе разработанного алгоритма

	

	В данном разделе приводится описание текста программы выполняющей генерацию паролей пользователей. Данная программа реализована на языке программирования С++ при помощи интегрированной среды обработки Visual С++.

	Поскольку архитектура Windows-программ основана на принципе сообщений, все эти программы содержат некоторые общие компоненты. Обычно их приходится в явном виде включать в исходный код. Но, к счастью, при использовании библиотеки MFC это происходит автоматически; нет необходимости тратить время и усилия на их написание. Создание диалогового приложения с использованием AppWizard

	Работа с элементами управления

	Для начала необходимо создать поле, в котором будет выводиться сгенерированный код. Для этого в рабочую область перетаскивается элемент Edit Box (Текстовое поле). Затем регулируются ее размеры и положение.

	Так же необходимо создать клавишу после, которой будет происходить генерация кода, для этого перетащим из панели инструментов элемент с названием Button.

	Откроем диалоговое окно Edit Properties. В тестовое поле раскрывающего списка ID: (Идентификатор ресурса) вместо идентификатора IDC_EDIT1 введём идентификатор IDGEN, а в поле caption введём слово Generirowanie.

	Клавишу Cancel которую создал MFC AppWizard оставим без изменений но укажем новое местоположение.

	На этом этап формирования диалогового окна можно считать законченным. Дело в том, что одновременно с производимыми нами действиями программная оболочка Visual C++ фиксировала все вносимые изменения в файлах PassGen.rc и resource.h.

	Создание класса диалога

	Приступим к созданию класса диалога. Очень большую долю работы по созданию этого класса уже выполнил мастер AppWizard, а еще некоторую часть работы возьмет на себя мастер ClassWizard.

	Оболочка Visual C++ сама создаст Password.cpp и Random.cpp. Далее необходимо будет заменить данные файлы, на файлы, приведённые в приложении Б и В соответственно.

	Далее остаётся только сохранить и откомпилировать данную программу.

	На этом создание программы на языке С++ закончилось.

	
5. Экспериментальная проверка количественных оценок

	

	Данную экспериментальную проверку будем осуществлять, изменяя скорость подбора паролей, и фиксировать время, за которое не будет скомпрометирован пароль, при этом значения P и S изменяться не будут.

	- вероятность подбора пароля P=10-3;

	- мощность пространства паролей S=1,6*1012

	Время, за которое данный пароль не будет скомпрометирован, вычисляется по следующей формуле: T=(P * S) / V

	1 Скорость подбора пароля V, паролей /сек-1*105;

	T=(10-3*1.6*1012) / 105 = 1600 секунд => 4.44 часа

	2 Скорость подбора пароля V, паролей /сек-2*105;

	T=(10-3*1.6*1012) / 2*105 = 8000 секунд => 2.22 часа

	3 Скорость подбора пароля V, паролей /сек-2,5*105;

	T=(10-3*1.6*1012) / 2,5*105 = 6400 секунд => 1.77 часа

	4 Скорость подбора пароля V, паролей /сек-3*105;

	T=(10-3*1.6*1012) / 3*105 = 5333 секунд => 1.48 часа

	При увеличении скорости подбора паролей в два раза время, затраченное на подбор, уменьшается также в два раза.

	Для того, что бы точно скомпрометировать пароль за три часа, необходима скорость подбора паролей V=1.5*108 паролей /сек. Время взлома также уменьшается от вида атаки и от степени осведомлённости злоумышленника. Так простейшая программа для взлома паролей архиватора RAR “Advanced RAR Password Recovery” предусматривает 3 типа атаки:

	- перебор

	- по маске

	- по словарю

	Сократить время взлома также можно, указав предполагаемую длину или установив её рамки, так же можно указать язык или набор символов, из которых предположительно состоит пароль.

	
6. Руководство пользователя

	

	Для начала работы с программой необходимо запустить файл с названием PassGen. После запуска появится окно. Для генерации пароля необходимо нажать на клавишу “GENERIROVANIE”. После чего в окошке появится сгенеррированный пароль. Далее необходимо запомнить пароль и использовать по назначению. При повторном нажатии на клавишу пароль будет сгенерирован вновь. Для выхода из программы необходимо нажать на клавишу “Выход” или нажав на “крестик”.

	
Заключение

	

	В процессе выполнения курсового проекта была разработана программа, генерирующая пароли пользователей. Программа была написана при помощи интегрированной среды разработки Visual C++. Программа соответствует всем функциональным требованиям, заданным на курсовое проектирование. Взаимодействие с пользователем осуществляется с помощью графического интерфейса.

	Таким образом, задание на курсовое проектирование было полностью выполнено.

	
Список использованных источников

	

	1 http://www.diwaxx.ru/hak/index.php

	2 http://www.passwords.ru

	3 Келецкий Я. Энциклопедия языка Си/ Пер. с англ.- М.: Мир, 1992. -687с.

	4 Керниган Б., Ричи Д., Фьюер А. Язык программирования Си. Задачи по языку С/ Пер. с англ. - М.: Финансы и статистика, 1985.-279с.

	
ПРИЛОЖЕНИЕ А

	

	Алгоритм программы

	

	

	

начало

	

Задание массива символов PassAlfavit[]

	

	

	

B

	

Случайное генерирование 1-го символа из массива PassAlfavit[]

-----------[с листа2

	

	

	

	

Запись символа в массив passwrd[]

	

Удаление последнего символа

Генерирование следующего символа

	

	

	

	

Такой символ есть

	

	

	

Запись символа в массив passwrd[] со следующим индексом

	

	

Кол-во символов достигнуто

	

	

	

А--------------[на лист 2

	

	Рисунок А.1. Алгоритм программы

	


А---------------------------------------[с листа 1

	

B

	



Присоединение символов------[на лист 1

	

Удаление всего кода

	

	

Есть в словаре

	

	

	

	

Вывод пароля на экран

	

	

	

конец

	

	

	Рисунок А.1. Лист №2

	
ПРИЛОЖЕНИЕ Б

	

	Текст программы

	// Password.cpp: implementation of the Password class.

	//////////////////////////////////////////////////////////////////////

	#include <afx.h>

	#include "stdafx.h"

	#include "PassGen.h"

	#include "Password.h"

	#include "Random.h"

	#ifdef _DEBUG

	#undef THIS_FILE

	static char THIS_FILE[]=__FILE__;

	#define new DEBUG_NEW

	#endif

	//////////////////////////////////////////////////////////////////////

	// Construction/Destruction

	//////////////////////////////////////////////////////////////////////

	Password::Password(int l)

	{length = l;

	passwrd = new char [length+1];

	dicstr = new char [length+1];

	PassAlfavit = new char [36];

	HowMuchn = new int [length];

	dicstr[length]='\0';

	ValueOfDictionary= 134547;}

	Password::~Password()

	{delete(passwrd);

	delete(dicstr);

	delete(PassAlfavit);

	delete(HowMuchn);}

	void Password::GenAlfavit()

	{char symbol='A';

	for (int index=0;index<36;index++)

	{if (index==26)

	symbol='0';

	PassAlfavit[index]=symbol;

	symbol++;}}

	char * Password::GetPassword()

	{return passwrd;}

	void Password::GenPass()

	{Random rnd1;

	for (int index =0;index<length;index++)

	passwrd[index]=PassAlfavit[rnd1.NextR(35)];

	passwrd[index]='\0';}

	BOOL Password::TestChar()

	{ClearMass(length,HowMuchn);

	for (int index1=0;index1<length;index1++)

	for (int index2=0;index2<length;index2++)

	if (passwrd[index1]==passwrd[index2])

	HowMuchn[index1]++;

	if (HowMuch(length,HowMuchn))

	return TRUE;

	else return FALSE;}

	void Password::ClearMass(int length,int * mass)

	{for (int index =0;index<length;index++)

	mass[index]=0;}

	BOOL Password::HowMuch(int length, int *HowMuch)

	{for (int index =0;index<length;index++)

	if (HowMuch[index]>1)

	return FALSE;

	return TRUE;}

	BOOL Password::TestDictionary()

	{CFile Dictionary;

	Try

	{Dictionary.Open("length08.txt",CFile.modeRead,NULL);}

	catch(CFileException *e )

	{Dictionary.Abort(); // close file safely and quietly

	e->~CFileException();

	MessageBox(0,"Не удается открыть словарь", "ошибка", MB_APPLMODAL|MB_OK|MB_ICONSTOP);

	return FALSE;}

	for (int index =0;index<ValueOfDictionary;index++)

	{Dictionary.Read(dicstr,8);

	Dictionary.Seek(2,CFile.current);

	if (Compare(length))

	return FALSE;}

	Dictionary.Close();

	return TRUE;}

	int Password::Compare(int length)

	{for (int index=0;index<length;index++)

	if (passwrd[index]!=dicstr[index])

	return 0;

	return 1;}

	
ПРИЛОЖЕНИЕ В

	

	Random.cpp

	// Random.cpp: implementation of the Random class.

	//////////////////////////////////////////////////////////////////////

	#include <windows.h>

	#include <Winbase.h>

	#include <stdlib.h>

	#include "stdafx.h"

	#include "PassGen.h"

	#include "Random.h"

	#ifdef _DEBUG

	#undef THIS_FILE

	static char THIS_FILE[]=__FILE__;

	#define new DEBUG_NEW

	#endif

	//////////////////////////////////////////////////////////////////////

	// Construction/Destruction

	//////////////////////////////////////////////////////////////////////

	Random::Random()

	{srand(GetTickCount());}

	Random::~Random()

	{}

	int Random::NextR(int x)

	{int rnd1;

	rnd1=rand();

	srand(rnd1);

	rnd1=rand() % x;

	return rnd1;}

	
ПРИЛОЖЕНИЕ Г

	

	PassGenDlg.cpp

	// PassGenDlg.cpp : implementation file

	#include "stdafx.h"

	#include "PassGen.h"

	#include "PassGenDlg.h"

	#include "Password.h"

	#ifdef _DEBUG

	#define new DEBUG_NEW

	#undef THIS_FILE

	static char THIS_FILE[] = __FILE__;

	#endif

	/////////////////////////////////////////////////////////////////////////////

	// CPassGenDlg dialog

	CPassGenDlg::CPassGenDlg(CWnd* pParent /*=NULL*/)

	: CDialog(CPassGenDlg::IDD, pParent)

	{//{{AFX_DATA_INIT(CPassGenDlg)

	// NOTE: the ClassWizard will add member initialization here

	//}}AFX_DATA_INIT

	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}

	void CPassGenDlg::DoDataExchange(CDataExchange* pDX)

	{CDialog::DoDataExchange(pDX);

	//{{AFX_DATA_MAP(CPassGenDlg)

	// NOTE: the ClassWizard will add DDX and DDV calls here

	//}}AFX_DATA_MAP}

	BEGIN_MESSAGE_MAP(CPassGenDlg, CDialog)

	//{{AFX_MSG_MAP(CPassGenDlg)

	ON_WM_PAINT()

	ON_WM_QUERYDRAGICON()

	ON_BN_CLICKED(IDGEN, OnGen)

	//}}AFX_MSG_MAP

	END_MESSAGE_MAP()

	/////////////////////////////////////////////////////////////////////////////

	// CPassGenDlg message handlers

	BOOL CPassGenDlg::OnInitDialog()

	{CDialog::OnInitDialog();

	// Set the icon for this dialog. The framework does this automatically

	// when the application's main window is not a dialog

	SetIcon(m_hIcon, TRUE);			// Set big icon

	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	return TRUE; // return TRUE unless you set the focus to a control}

	// If you add a minimize button to your dialog, you will need the code below

	// to draw the icon. For MFC applications using the document/view model,

	// this is automatically done for you by the framework.

	void CPassGenDlg::OnPaint()

	{if (IsIconic())

	{CPaintDC dc(this); // device context for painting

	SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

	// Center icon in client rectangle

	int cxIcon = GetSystemMetrics(SM_CXICON);

	int cyIcon = GetSystemMetrics(SM_CYICON);

	CRect rect;

	GetClientRect(&rect);

	int x = (rect.Width() - cxIcon + 1) / 2;

	int y = (rect.Height() - cyIcon + 1) / 2;

	// Draw the icon

	dc.DrawIcon(x, y, m_hIcon);}

	else

	{CDialog::OnPaint();}}

	// The system calls this to obtain the cursor to display while the user drags

	// the minimized window.

	HCURSOR CPassGenDlg::OnQueryDragIcon()

	{return (HCURSOR) m_hIcon;}

	void CPassGenDlg::OnGen()

	{Password ps (8) ;

	ps.GenAlfavit();

	do

	{ps.GenPass();

	if (!ps.TestChar())

	continue;

	else

	if (ps.TestDictionary())

	break;

	else

	continue;}

	while (TRUE);

	SetDlgItemText(IDC_EDIT1,ps.GetPassword());}