Обеспечение безопасности базы данных системы "Монитор КПЭ" для определения и хранения ключевых показателей эффективности НИУ ВШЭ

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 14.07.2020
Размер файла 1,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

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

Нет

2

ur_chief

Руководи-тели подразде-лений

Доступ к журналам действий подчиненных, формирование перекрестных отчетов, создаваемых по данным, вносимым сотрудниками подразделения.

Действия только с объектами, назначенными данному подразделению

3

ur_teacher

Препода-ватели

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

Просматривать и изменять только те данные, что сами вносили

4

ur_staff

Прочие сотрудники с доступом в базу данных

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

Просматривать и изменять только те данные, что вносили пользователи департамента

Модуль шифрования реализуется отдельно, так как от встроенной криптографической системы приходится отказаться. Для решения этой проблемы разрабатывается дополнительный модуль, реализующий шифрование по стандарту ГОСТ 34.12-2018 (7). Данный функциональный модуль встраивается в иерархию дополнительным уровнем и затем отключается стандартное шифрование, преустановленное в Microsoft SQL Server. Разработанное программное обеспечение размещено в приложении 1 к данной работе. Реализация модуля с помощью хранимых процедур была сделана не случайно: такой вариант организации процедуры шифрования выигрывает в скорости и надежности, поскольку не происходит передачи данных по сети.

2.3 Разработка пользовательских интерфейсов модуля администрирования автоматизированной системы учета и анализа ключевых показателей эффективности

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

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

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

Рисунок 3. Окно авторизации

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

Рисунок 4. Универсальное окно ошибки

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

Рисунок 5. Рабочий стол администратора системы

Рисунок 6. Рабочий стол пользователя системы

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

Рисунок 7. Панель управления списком пользователей системы

Выводы по второй главе

1. Проведен анализ альтернатив и обоснован выбор конкретных инструментальных средств проектирования и разработки модулей безопасности автоматизированной системы.

2. Разработана нормативно-справочная информация автоматизированной системы учета и анализа ключевых показателей эффективности «Монитор КПЭ» деятельности подразделения вуза.

3. Представлено описание для каждой подсистемы.

4. Спроектированы макеты пользовательских интерфейсов с учетом сформулированных требований.

Глава 3. Тестирование модулей обеспечения безопасности данных автоматизированной системы учета и анализа ключевых показателей эффективности

3.1 Построение модели нарушителя системы безопасности автоматизированной системы учета и анализа ключевых показателей эффективности

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

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

Естественным решением становится учет персонала, допускаемого до компонентов базы данных и четкое распределение полномочий среди них. Необходимо выделять и ограничивать уровни доступа к данным и управления системой в целом, отметая принцип «все - ко - всем».

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

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

В результате проведенного анализа можно сделать вывод, что наиболее вероятными моделями нарушителя являются:

· Тип: внутренний;

· Цель: несанкционированный доступ, фальсификация данных, уничтожение данных;

· Причина: халатность.

3.2 Построение математической модели атаки несанкционированного доступа в разрабатываемую автоматизированную систему учета и анализа ключевых показателей эффективности

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

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

В рамках введенной модели обозначим через случайную величину равную количеству попыток до определения истинного варианта пароля. Буквой K обозначим мощность парольного множества. Если учесть, что произведение от 1 до 0 считается равным 1, нетрудно видеть, что:

Для вычисления моментов случайной величины докажем утверждение.

Утверждение.

В рамках введенной теоретико-вероятностной модели имеют место соотношения:

Доказательство.

Нетрудно видеть, что

Для дисперсии случайной величины имеем:

Далее, несложно проверить справедливость равенства:

В завершении доказательства утверждения, объединим все полученные выражения и получим:

ч.т.д.

Рассчитаем количество случайных попыток до определения истинного варианта пароля, согласно построенной модели. Согласно установленным требованиям, парольное слово должно содержать буквы латинского алфавита обоих регистров, цифр и специальные символы, длина парольного секрета находится в интервале 6 - 8. Таким образом мощность множества ключей:

Тогда среднее число попыток перебора пароля злоумышленником до определения истинного варианта пароля будет примерно 5·109. Если тратить на одну попытку около миллисекунды, то в среднем потребуется около двух месяцев для взлома системы. При ограничении числа неудачных попыток авторизации (не более трёх подряд) с последующим блокированием эта атака становится еще менее реализуемой, так как ее срок выполнения растягивается на 97 лет. За это время опытный администратор безопасности отследит сигнатуру атаки в журналах логирования и примет соответствующие меры.

3.3 Формирование тест-кейсов. Результаты тестирования

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

Одной из самых популярных является SQL-инъекция или Атака внедрением SQL кода (3). Это процесс введения SQL инструкций языка Transact-SQL вместо предназначенных для ввода допустимых данных. Чаще всего в текстовое поле вводится новая команда с меткой комментария в конце, чтобы оборвать передаваемую последовательность в случае ее конфигурации перед отправкой серверу. Такие действия обычно направлены на повреждение, хищение или уничтожение данных на сервере. Обезопасить себя можно достаточно идейно просто: разработав процедуры фильтрации вводимых данных. Однако это требует серьезной подготовки и квалификации разработчика. Другим возможным решением может стать отказ от динамического исполнения SQL-команд в пользу хранимых на сервере процедур и команд с пользовательскими параметрами.

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

Зондирование автоматизированной системы и интеллектуальное наблюдение можно отнести к атакам промышленного шпионажа. Для получения начального представления о системе, злоумышленник может провести атаку «черного ящика», анализируя реакцию системы на различные действия. Даже из сообщений об ошибках, передаваемых базой данных, можно почерпнуть информацию о настройках системы, ее компонентах и потенциальных уязвимостях. Для борьбы с данной атакой производится обработка сообщений об ошибках, возвращаемых базой данных, и их интерпретация. Такой также подход обеспечивает достижение одного из нефункциональных требований - человекопонятного сопровождения пользователя и интуитивного интерфейса.

Еще одним слабым местом системы могла стать строка данных для соединения с базой, в случае если она конструируется покомпонентно параллельно с выполнением кода. Злоумышленник может добавить дополнительные символы и получить доступ к ресурсам системы. Для отражения такой атаки можно воспользоваться громоздкой системой дополнительной фильтрации вводимых данных. Наилучшим решением для отражения данного вида атаки является предпочтение встроенного режима проверки подлинности через возможности операционной системы Windows. Однако в нашем случае такое поведение было не рационально с точки зрения разработки, поэтому было отдано преимущество разработке модуля безопасного подключения с помощью SqlConnectionStringBuilder - функция, проверяющая строки соединения во время исполнения.

Классические атаки взлома парольной системы, основаны на переборе (полном или усеченном разными подходами) возможных парольных фраз для получения несанкционированного доступа к системе. Оценки надежности выбранной парольной системы посвящен предшествующий пункт данной работы 3.1. однако существует угроза простого подсматривания (иногда и не во время использования пароля легитимным пользователем, например, в случае если последний хранит записанный пароль в доступном месте) или преднамеренной передачи пароля доступа в систему. К тому же остается вероятность ослабления парольной системы из-за человеческого фактора. Зачастую пользователь выбирает пароль, который легко запомнить. Однако в тоже время его становится легко подобрать. Чтобы справиться с этой уязвимостью, разработана жесткая парольная политика в автоматизированной системе.

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

Выводы по третьей главе

1. Разработана модель нарушителя системы безопасности автоматизированной системы учета и анализа ключевых показателей эффективности;

2. Разработана математическая модель несанкционированного доступа, дано обоснование требований парольной политики;

3. Проведен анализ существующих уязвимостей автоматизированной системы, приведены пути противодействия, даны существенные рекомендации;

4. Проведено тестирование работоспособности модулей безопасности системы.

Заключение

В настоящее время обеспечению информационной безопасности уделяется большое внимание во всех сферах. При разработке автоматизированной системы учета и анализа ключевых показателей эффективности «Монитор КПЭ» для подразделений высших учебных заведений, особое внимание уделялось безопасности данных в системе. Проведенное в рамках данной работы исследование показало необходимость разработки нескольких модулей обеспечения безопасности информации. Это позволит решить одновременно несколько проблем:

? обеспечение защиты конфиденциальности данных в базе автоматизированной системы учета и анализа ключевых показателей эффективности;

? разграничение прав доступа к ресурсам системы согласно полномочиям.

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

В перспективе планируется внедрение систем логирования и резервного копирования данных.

Список литературы

1. Межгосударственный стандарт ГОСТ 34.003-90: Информационная технология. Комплекс стандартов на автоматизированные системы.

2. Национальный стандарт Российской Федерации ГОСТ Р ИСО/МЭК 15408-1-2012: Информационная технология. Методы и средства обеспечения безопасности. Критерии оценки безопасности информационных технологий. Часть 1. Введение и общая модель. ОКС 35.040. ОКСТУ 4002. Дата введения 2013-12-01.

3. Национальный стандарт Российской Федерации ГОСТ Р ИСО/МЭК 15408-2 Информационная технология. Методы и средства обеспечения безопасности. Критерии оценки безопасности информационных технологий. Часть 2. Функциональные компоненты безопасности. ОКС 35.040ОКСТУ 4002. Дата введения 2014-09-01.

4. Национальный стандарт Российской Федерации ГОСТ Р ИСО/МЭК 15408-3 Информационная технология. Методы и средства обеспечения безопасности. Критерии оценки безопасности информационных технологий. Часть 3. Компоненты доверия к безопасности. ОКС 35.040ОКСТУ 4002. Дата введения 2014-09-01.

5. Национальный стандарт Российской Федерации ГОСТ Р ИСО/МЭК 18045 Информационная технология. Методы и средства обеспечения безопасности. Методология оценки безопасности информационных технологий. ОКС 35.040ОКСТУ 4002. Дата введения 2014-07-01.

6. Национальный стандарт Российской Федерации ГОСТ 34.12-2018. Информационная технология. Криптографическая защита информации. Блочные шифры. Введено в действие 1 июня 2019 года.

7. Теоретические основы компьютерной безопасности. Учебное пособие. Кабанов А.С., Лось А.Б., Першаков А.С. - М.: ГОУВПО МИЭМ (ТУ), 2009 - 272 с.

8. ASP.NET. Классы криптографии

9. Краткая справка о платформе Microsoft SQL Server. Возможности платформы.

10. Новые возможности Visual Studio.

11. Что такое архитектура программного обеспечения?

администрирование автоматизированный безопасность несанкционированный

Приложение 1

Модуль шифрования, реализующий алгоритм по ГОСТу 34.12-2018

// kuznechik.h

#ifndef KUZNECHIK_H

#define KUZNECHIK_H

#include <stdint.h>

typedef union

{

uint64_t q[2];

uint8_t b[16];

} w128_t;

typedef struct

{

w128_t k[10]; // round keys

} kuz_key_t;

void kuz_init(); // initilize of lookup tables

// keys setup

void kuz_set_encrypt_key(kuz_key_t *subkeys, const uint8_t key[32]);

void kuz_set_decrypt_key(kuz_key_t *subkeys, const uint8_t key[32]);

void kuz_encrypt_block(kuz_key_t *subkeys, void *x);

void kuz_decrypt_block(kuz_key_t *subkeys, void *x);

#endif

// kuznechik.cs

// GOST 34.12-2018, version with 128 bit

#include "kuznechik.h"

#include <mmintrin.h>

#include <emmintrin.h>

#include <smmintrin.h>

#ifndef __SSE4_1__

#error "This version has __SSE4_1__"

#endif

static int kuz_initialized = 0;

static __m128i kuz_enc[16][256];

static __m128i kuz_decl[16][256];

static __m128i kuz_dec[16][256];

// S-Box

static const uint8_t kuz_gost[0x100] =

{

0xFC, 0x0E, 0xDD, 0x61, 0xCF, 0x6E, 0x21, 0x16, 0xFB, 0xC4, 0xFA, 0xDA, 0x63, 0xC5, 0x04, 0x4D, 0x77, 0xF0, 0xDB, 0x93, 0x2E, 0x09, 0x5A, 0x17, 0x36, 0x61, 0xBB, 0x14, 0xCD, 0x5F, 0xC1, 0xF9, 0x18, 0x65, 0x5A, 0xE2, 0x5C, 0xEF, 0x21, 0x81, 0x1C, 0x3C, 0x42, 0x8B, 0x01, 0x8E, 0x4F, 0x04, 0x84, 0x02, 0xAE, 0x13, 0x6A, 0x8F, 0xA0, 0x06, 0x0B, 0xED, 0x98, 0x7F, 0xD4, 0xD3, 0x1F, 0xEB, 0x34, 0x2C, 0x51, 0xEA, 0xC8, 0x48, 0xAB, 0xF2, 0x2A, 0x68, 0xA2, 0xFD, 0x3A, 0xCE, 0xCC, 0xB5, 0x70, 0x0E, 0x56, 0x18, 0x0C, 0x76, 0x12, 0x62, 0x13, 0x47, 0x9C, 0xB7, 0x5D, 0x87, 0x15, 0xA1, 0x96, 0x29, 0x10, 0x7B, 0x9A, 0xC7, 0x91, 0x78, 0x6F, 0x9D, 0x9E, 0x72, 0xB1, 0x32, 0x75, 0x19, 0x3D, 0xFF, 0x35, 0x8A, 0x7E, 0x6D, 0x54, 0xC6, 0x80, 0xC3, 0xBD, 0x0D, 0x47, 0xDF, 0xF5, 0x24, 0xA9, 0x3E, 0xA8, 0x43, 0xC9, 0xD7, 0x79, 0xD6, 0xF6, 0xDC, 0xE8, 0x58, 0x50, 0x4E, 0x33, 0x6A, 0x4A, 0xA7, 0x97, 0x60, 0x73, 0x1E, 0x00, 0x62, 0x44, 0x1A, 0xB8, 0x38, 0x82, 0x64, 0x9F, 0x26, 0x41, 0xAD, 0x45, 0x46, 0x92, 0x27, 0x5E, 0x55, 0x2F, 0x8C, 0xA3, 0xA5, 0x7D, 0x69, 0xD5, 0x95, 0x3B, 0x07, 0x58, 0xB3, 0x40, 0x86, 0x4C, 0x1D, 0xF7, 0x30, 0x37, 0x6B, 0xE4, 0x88, 0xD9, 0xE7, 0x79, 0xE1, 0x1B, 0x83, 0x29, 0x4C, 0x3F, 0xF8, 0xFE, 0x8D, 0x53, 0xAA, 0x90, 0xCA, 0xD8, 0x85, 0x61, 0x20, 0x71, 0x67, 0xA4, 0x7D, 0x2B, 0x09, 0x4B, 0x9B, 0x65, 0xD0, 0xBE, 0xE5, 0x6C, 0x52, 0x53, 0xA6, 0x74, 0xD2, 0xE6, 0xF4, 0xB4, 0xC0, 0x76, 0xAF, 0xC2, 0x39, 0x4B, 0x63, 0x50, 0xB6

};

// Reverse S-Box

static const uint8_t kuz_rev_gost[0x100] =

{

0xA5, 0x2D, 0x32, 0x8F, 0x0E, 0x30, 0x38, 0xC0, 0xE6, 0x9E, 0x39, 0x55, 0x7E, 0x52, 0x91, 0x64, 0x03, 0x57, 0x5A, 0x1C, 0x60, 0x07, 0x18, 0x21, 0x72, 0xA8, 0xD1, 0x29, 0xC6, 0xA4, 0x3F, 0xE0, 0x27, 0x8D, 0x0C, 0x82, 0xEA, 0xAE, 0xB4, 0x9A, 0x63, 0x49, 0xE5, 0x42, 0xE4, 0x15, 0xB7, 0xC8, 0x06, 0x70, 0x9D, 0x41, 0x75, 0x19, 0xC9, 0xFC, 0x4D, 0xBF, 0x2A, 0x73, 0x84, 0xD5, 0xC3, 0xAF, 0x2B, 0x86, 0xA7, 0xB1, 0xB2, 0x5B, 0x46, 0xD3, 0x9F, 0xFD, 0xD4, 0x0F, 0x9C, 0x2F, 0x9B, 0x43, 0xEF, 0xD9, 0x79, 0xB6, 0x53, 0x7F, 0xC1, 0xF0, 0x23, 0xE7, 0x25, 0x5E, 0xB5, 0x1E, 0xA2, 0xDF, 0xA6, 0xFE, 0xAC, 0x22, 0xF9, 0xE2, 0x4A, 0xBC, 0x35, 0xCA, 0xEE, 0x78, 0x05, 0x6B, 0x51, 0xE1, 0x59, 0xA3, 0xF2, 0x71, 0x56, 0x11, 0x6A, 0x89, 0x94, 0x65, 0x8C, 0xBB, 0x77, 0x3C, 0x28, 0xAB, 0xD2, 0x31, 0xDE, 0xC4, 0x5F, 0xCC, 0xCF, 0x76, 0x2C, 0xB8, 0xD8, 0x2E, 0x36, 0xDB, 0x69, 0xB3, 0x14, 0x95, 0xBE, 0x62, 0xA1, 0x3B, 0x16, 0x66, 0xE9, 0x5C, 0x6C, 0x6D, 0xAD, 0x37, 0x61, 0x4B, 0xB9, 0xE3, 0xBA, 0xF1, 0xA0, 0x85, 0x83, 0xDA, 0x47, 0xC5, 0xB0, 0x33, 0xFA, 0x6F, 0x6E, 0xC2, 0xF6, 0x50, 0xFF, 0x5D, 0xA9, 0x8E, 0x17, 0x1B, 0x97, 0x7D, 0xEC, 0x58, 0xF7, 0x1F, 0xFB, 0x7C, 0x09, 0x0D, 0x7A, 0x67, 0x45, 0x87, 0xDC, 0xE8, 0x4F, 0x1D, 0x4E, 0x04, 0xEB, 0xF8, 0xF3, 0x3E, 0x3D, 0xBD, 0x8A, 0x88, 0xDD, 0xCD, 0x0B, 0x13, 0x98, 0x02, 0x93, 0x80, 0x90, 0xD0, 0x24, 0x34, 0xCB, 0xED, 0xF4, 0xCE, 0x99, 0x10, 0x44, 0x40, 0x92, 0x3A, 0x01, 0x26, 0x12, 0x1A, 0x48, 0x68, 0xF5, 0x81, 0x8B, 0xC7, 0xD6, 0x20, 0x0A, 0x08, 0x00, 0x4C, 0xD7, 0x74

};

// vector

static const uint8_t kuz_v[16] =

{

0x94, 0x20, 0x85, 0x10, 0xC2, 0xC0, 0x01, 0xFB,

0x01, 0xC0, 0xC2, 0x10, 0x85, 0x20, 0x94, 0x01

};

// multiplication by mod p(x) = x^8 + x^7 + x^6 + x + 1

static uint8_t kuz_mul(uint8_t x, uint8_t y)

{

uint8_t z = 0;

while (y)

{

if (y & 1) z ^= x;

x = (x << 1) ^ (x & 0x80 ? 0xC3 : 0x00);

y >>= 1;

}

return z;

}

// linear operation

static void kuz_l(w128_t *w)

{

uint8_t x;

for (int j = 0; j < 16; j++) // 16 rounds

{// LFSR for 16 elements of GF(2^8)

x = w->b[15]; // v[15] = 1

for (int i = 14; i >= 0; i--)

{

w->b[i + 1] = w->b[i];

x ^= kuz_mul(w->b[i], kuz_v[i]);

}

w->b[0] = x;

}

}

// reversed linear operation

static void kuz_rev(w128_t *w)

{

uint8_t x;

for (int j = 0; j < 16; j++) // 16 rounds

{

x = w->b[0];

for (int i = 0; i < 15; i++)

{

w->b[i] = w->b[i + 1];

x ^= kuz_mul(w->b[i], kuz_v[i]);

}

w->b[15] = x;

}

}

// key's setup

void kuz_set_encrypt_key(kuz_key_t *kuz, const uint8_t key[32])

{

w128_t c, x, y, z;

if (!kuz_initialized) kuz_init();

for (int i = 0; i < 16; i++)

{

x.b[i] = key[i];

y.b[i] = key[i + 16];

}

kuz->k[0].q[0] = x.q[0]; kuz->k[0].q[1] = x.q[1];

kuz->k[1].q[0] = y.q[0]; kuz->k[1].q[1] = y.q[1];

for (int i = 1; i <= 32; i++)

{

c.q[0] = 0; c.q[1] = 0;

c.b[15] = i;

kuz_l(&c);

z.q[0] = x.q[0] ^ c.q[0]; z.q[1] = x.q[1] ^ c.q[1];

for (int j = 0; j < 16; j++) z.b[j] = kuz_gost[z.b[j]];

kuz_l(&z);

z.q[0] ^= y.q[0]; z.q[1] ^= y.q[1];

y.q[0] = x.q[0]; y.q[1] = x.q[1];

x.q[0] = z.q[0]; x.q[1] = z.q[1];

if ((i & 7) == 0)

{

kuz->k[(i >> 2)].q[0] = x.q[0]; kuz->k[(i >> 2) + 1].q[0] = y.q[0];

kuz->k[(i >> 2)].q[1] = x.q[1]; kuz->k[(i >> 2) + 1].q[1] = y.q[1];

}

}

}

void kuz_set_decrypt_key(kuz_key_t *kuz, const uint8_t key[32])

{

kuz_set_encrypt_key(kuz, key);

for (int i = 1; i < 10; i++) kuz_rev(&kuz->k[i]);

}

// encryption

void kuz_encrypt_block(kuz_key_t *key, void *blk)

{

__m128i x;

x = *((__m128i *) blk);

for (int i = 0; i < 9; i++)

{

x ^= *((__m128i *) &key->k[i]);

x = kuz_enc[ 0][((uint8_t *) &x)[ 0]]

^ kuz_enc[ 1][((uint8_t *) &x)[ 1]]

^ kuz_enc[ 2][((uint8_t *) &x)[ 2]]

^ kuz_enc[ 3][((uint8_t *) &x)[ 3]]

^ kuz_enc[ 4][((uint8_t *) &x)[ 4]]

^ kuz_enc[ 5][((uint8_t *) &x)[ 5]]

^ kuz_enc[ 6][((uint8_t *) &x)[ 6]]

^ kuz_enc[ 7][((uint8_t *) &x)[ 7]]

^ kuz_enc[ 8][((uint8_t *) &x)[ 8]]

^ kuz_enc[ 9][((uint8_t *) &x)[ 9]]

^ kuz_enc[10][((uint8_t *) &x)[10]]

^ kuz_enc[11][((uint8_t *) &x)[11]]

^ kuz_enc[12][((uint8_t *) &x)[12]]

^ kuz_enc[13][((uint8_t *) &x)[13]]

^ kuz_enc[14][((uint8_t *) &x)[14]]

^ kuz_enc[15][((uint8_t *) &x)[15]];

}

x ^= *((__m128i *) &key->k[9]);

*((__m128i *) blk) = x;

}

// decryption

void kuz_decrypt_block(kuz_key_t *key, void *blk)

{

__m128i x;

x = *((__m128i *) blk);

x = kuz_decl[ 0][((uint8_t *) &x)[ 0]]

^ kuz_decl[ 1][((uint8_t *) &x)[ 1]]

^ kuz_decl[ 2][((uint8_t *) &x)[ 2]]

^ kuz_decl[ 3][((uint8_t *) &x)[ 3]]

^ kuz_decl[ 4][((uint8_t *) &x)[ 4]]

^ kuz_decl[ 5][((uint8_t *) &x)[ 5]]

^ kuz_decl[ 6][((uint8_t *) &x)[ 6]]

^ kuz_decl[ 7][((uint8_t *) &x)[ 7]]

^ kuz_decl[ 8][((uint8_t *) &x)[ 8]]

^ kuz_decl[ 9][((uint8_t *) &x)[ 9]]

^ kuz_decl[10][((uint8_t *) &x)[10]]

^ kuz_decl[11][((uint8_t *) &x)[11]]

^ kuz_decl[12][((uint8_t *) &x)[12]]

^ kuz_decl[13][((uint8_t *) &x)[13]]

^ kuz_decl[14][((uint8_t *) &x)[14]]

^ kuz_decl[15][((uint8_t *) &x)[15]];

for (i = 9; i > 1; i--)

{

x ^= *((__m128i *) &key->k[i]);

x = kuz_dec[ 0][((uint8_t *) &x)[ 0]]

^ kuz_dec[ 1][((uint8_t *) &x)[ 1]]

^ kuz_dec[ 2][((uint8_t *) &x)[ 2]]

^ kuz_dec[ 3][((uint8_t *) &x)[ 3]]

^ kuz_dec[ 4][((uint8_t *) &x)[ 4]]

^ kuz_dec[ 5][((uint8_t *) &x)[ 5]]

^ kuz_dec[ 6][((uint8_t *) &x)[ 6]]

^ kuz_dec[ 7][((uint8_t *) &x)[ 7]]

^ kuz_dec[ 8][((uint8_t *) &x)[ 8]]

^ kuz_dec[ 9][((uint8_t *) &x)[ 9]]

^ kuz_dec[10][((uint8_t *) &x)[10]]

^ kuz_dec[11][((uint8_t *) &x)[11]]

^ kuz_dec[12][((uint8_t *) &x)[12]]

^ kuz_dec[13][((uint8_t *) &x)[13]]

^ kuz_dec[14][((uint8_t *) &x)[14]]

^ kuz_dec[15][((uint8_t *) &x)[15]];

}

x ^= *((__m128i *) &key->k[1]);

for (int j = 0; j < 16; j++)

((uint8_t *) &x)[j] = kuz_rev_gost[((uint8_t *) &x)[j]];

x ^= *((__m128i *) &key->k[0]);

*((__m128i *) blk) = x;

}

// initialization of lookup tables

void kuz_init()

{

w128_t x;

for (i = 0; i < 16; i++)

for (j = 0; j < 256; j++)

{

x.q[0] = 0; x.q[1] = 0;

x.b[i] = kuz_gost[j];

kuz_l(&x);

kuz_enc[i][j] = *((__m128i *) &x);

x.q[0] = 0; x.q[1] = 0;

x.b[i] = j; // kuz_gost[j];

kuz_rev(&x);

kuz_decl[i][j] = *((__m128i *) &x);

x.q[0] = 0; x.q[1] = 0;

x.b[i] = kuz_rev_gost[j];

kuz_rev(&x);

kuz_dec[i][j] = *((__m128i *) &x);

}

kuz_initialized = 1;

}

using System;

using Microsoft.SqlServer.Server;

using System.Collections;

using System.Security.Cryptography;

using System.Text;

public class GOST_CLR

{

[

SqlFunction(FillRowMethodName = "FillRow",

TableDefinition = "publicAndPrivateKeys nvarchar(max),

justPublicKey nvarchar(max)")

]

public static IEnumerable GenerateKeys(int KeySize)

{

ArrayList row = new ArrayList();

GOST_CryptoServiceProvider GOST_Provider =

new GOST_CryptoServiceProvider(KeySize);

row.Add (new object[] {GOST_Provider.ToXmlString(true),

GOST_Provider.ToXmlString(false)});

return row;

}

public static void FillRow(Object row,

out string publicAndPrivateKeys, out string justPublicKey)

{

object[] xrow = (object[])row;

publicAndPrivateKeys = (string)xrow[0];

justPublicKey = (string)xrow[1];

}

public static string EncryptString(string inputString, int dwKeySize,

string xmlString)

{

GOST_CryptoServiceProvider gost_CryptoServiceProvider =

new GOST_CryptoServiceProvider(dwKeySize);

gost_CryptoServiceProvider.FromXmlString(xmlString);

int keySize = dwKeySize / 8;

byte[] bytes = Encoding.UTF32.GetBytes(inputString);

int maxLength = keySize - 42;

int dataLength = bytes.Length;

int iterations = dataLength / maxLength;

StringBuilder stringBuilder = new StringBuilder();

for (int i = 0; i <= iterations; i++)

{

byte[] tempBytes = new byte

[

(dataLength - maxLength * i > maxLength)

? maxLength

: dataLength - maxLength * i

];

Buffer.BlockCopy(bytes, maxLength * i, tempBytes, 0,

tempBytes.Length);

byte[] encryptedBytes =

gost_CryptoServiceProvider.Encrypt(tempBytes,true);

Array.Reverse(encryptedBytes);

stringBuilder.Append(Convert.ToBase64String(encryptedBytes));

}

return stringBuilder.ToString();

}

public static string DecryptString(string inputString, int dwKeySize,

string xmlString)

{

GOST_CryptoServiceProvider gost_CryptoServiceProvider

= new GOST_CryptoServiceProvider(dwKeySize);

gost_CryptoServiceProvider.FromXmlString(xmlString);

int base64BlockSize = ((dwKeySize / 8 ) % 3 != 0) ?

(((dwKeySize / 8 ) / 3) * 4) + 4 : ((dwKeySize / 8 ) / 3) * 4;

int iterations = inputString.Length / base64BlockSize;

ArrayList arrayList = new ArrayList();

for (int i = 0; i < iterations; i++)

{

byte[] encryptedBytes = Convert.FromBase64String(

inputString.Substring(base64BlockSize * i, base64BlockSize));

Array.Reverse(encryptedBytes);

arrayList.AddRange(gost_CryptoServiceProvider.Decrypt(

encryptedBytes, true));

}

return Encoding.UTF32.GetString(arrayList.ToArray(

Type.GetType("System.Byte")) as byte[]);

}

}

Данный блок функций реализует алгоритм шифрования по ГОСТ 34.12-2018, называемый «Кузнечик». Тут представлены функции предварительной начальной инициализации, развертки ключа, шифрования, расшифровывания и прочие вспомогательные функции. Помимо того тут код отключения встроенного алгоритма шифрования в базе данных Microsoft SQL Server и подключения своего алгоритма.

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

Приложение 2

Модуль безопасного подключения к базе данных

ConntoDB.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using ConnectSQLServer;

using System.Data.SqlClient;

namespace ConnectSQLServer

{

public class Connection

{

public static int ConnToDB(string username, string password,

out string str, out SqlConnection ret)

{

Console.WriteLine("Getting Connection ...");

SqlConnection conn = DBUtils.GetDBConnection(username, password);

ret = conn;

try

{

Console.WriteLine("Openning Connection ...");

conn.Open();

Console.WriteLine("Connection successful!");

str = "stat";

return 0;

}

catch (Exception e)

{

Console.WriteLine("Error: " + e.Message);

str = e.Message;

return 1;

}

Console.Read();

}

}

}

DBSQLServerUtils.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data.SqlClient;

namespace ConnectSQLServer

{

class DBSQLServerUtils

{

public static SqlConnection GetDBConnection(string datasource,

string database, string username, string password)

{// Data Source=*****;Initial Catalog=My_1;User ID=User-001;Password=111

string connString = @"Data Source=" + datasource + ";Initial Catalog="

+ database + ";Persist Security Info=True;User ID="

+ username + ";Password=" + password;

SqlConnection conn = new SqlConnection(connString);

return conn;

}

}

}

DBUtils.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data.SqlClient;

namespace ConnectSQLServer

{

class DBUtils

{

public static SqlConnection GetDBConnection()

{

string datasource = @"*****";

string database = "HSE_Test";

string username = "User-001";

string password = "111";

return DBSQLServerUtils.GetDBConnection(datasource,

database, username, password);

}

public static SqlConnection GetDBConnection(string username,

string password)

{

string datasource = @"*****";

string database = "HSE_Test";

return DBSQLServerUtils.GetDBConnection(datasource,

database, username, password);

}

}

}

Err.xaml.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

namespace LogConAdm

{

/// <summary>

/// Логика взаимодействия для Err.xaml

/// </summary>

public partial class Err : Window

{

public Err()

{

InitializeComponent();

}

public Err(string str)

{

InitializeComponent();

ErrorMessage.Text = str;

}

private void OK_Click(object sender, RoutedEventArgs e)

{

this.Hide();

}

}

}

Err.xaml

<Window x:Class="LogConAdm.Err"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:LogConAdm"

mc:Ignorable="d"

Title="Error"

FontFamily="Consolas"

FontWeight="Bold"

FontSize="14"

Width="300"

Height="150"

MinWidth="200"

MinHeight="150">

<Window.Resources>

<Style TargetType="TextBlock">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="16"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

<Setter Property="HorizontalAlignment" Value="Stretch"/>

<Setter Property="VerticalAlignment" Value="Center"/>

<Setter Property="TextWrapping" Value="Wrap"/>

</Style>

<Style TargetType="Button">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="16"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

<Setter Property="Background" Value="WhiteSmoke"/>

</Style>

<Style TargetType="TextBox">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="14"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

</Style>

</Window.Resources>

<Grid>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="10"/>

<ColumnDefinition/>

<ColumnDefinition Width="70"/>

<ColumnDefinition/>

<ColumnDefinition Width="10"/>

</Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition Height="10"/>

<RowDefinition />

<RowDefinition Height="35"/>

<RowDefinition Height="10"/>

</Grid.RowDefinitions>

<TextBlock

x:Name="ErrorMessage"

Grid.Column="1"

Grid.Row="1"

Grid.ColumnSpan="3"

Text="Что-то пошло не так..."

/>

<Button

x:Name="OK"

Grid.Column="2"

Grid.Row="2"

Content="OK" Click="OK_Click"

/>

</Grid>

</Window>

Данный блок программного обеспечения реализует безопасное подключение к базе данных. Также тут представлено универсальное окно «Ошибка» (и логика взаимодействия и отрисовка окна). Управление передается из окна авторизации, параметрами являются логин и пароль, введенный пользователем.

В случае неудачной попытки авторизации активируется счетчик неуспешных авторизаций и вызывается окно «Ошибка» с текстом, переданным из базы.

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

Приложение 3

Модуль авторизации в системе

MainWindow.xaml.cs

using System;

using System.Data.SqlClient;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

namespace LogConAdm

{

/// <summary>

/// Логика взаимодействия для MainWindow.xaml

/// </summary>

public partial class MainWindow : Window

{

public MainWindow()

{

InitializeComponent();

}

private void ButtonLogIn_Click(object sender, RoutedEventArgs e)

{

string username = ULogin.Text;

string userpass = UPassword.Password;

int userpassh = UPassword.Password.GetHashCode();

Console.WriteLine("Input " + username + " with " + userpass + " ("

+ userpassh + ')');

string str = "";

SqlConnection conn;

int flag = ConnectSQLServer.Connection.ConnToDB(username, userpass,

out str, out conn);

if (flag == 0)

{

AdmMenu a = new AdmMenu(username, conn);

a.Owner = this;

a.Show();

this.Hide();

}

else if (flag == 1)

{

Console.WriteLine("Error from MW: " + str);

Err a = new Err(str);

a.Show();

}

}

}

}

MainWindow.xaml

<Window x:Class="LogConAdm.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:LogConAdm"

Title="Authorization"

FontFamily="Consolas"

FontWeight="Bold"

FontSize="14"

Width="400"

Height="400"

MinWidth="300"

MinHeight="320">

<Window.Resources>

<Style TargetType="Label">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="16"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

<Setter Property="HorizontalAlignment" Value="Right"/>

<Setter Property="VerticalAlignment" Value="Center"/>

</Style>

<Style TargetType="Button">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="16"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

<Setter Property="Background" Value="WhiteSmoke"/>

</Style>

<Style TargetType="TextBox">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="14"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

</Style>

</Window.Resources>

<Grid>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="30"/>

<ColumnDefinition Width="100"/>

<ColumnDefinition />

<ColumnDefinition Width="30"/>

</Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition Height="10"/>

<RowDefinition Height="150"/>

<RowDefinition />

<RowDefinition Height="40"/>

<RowDefinition Height="40"/>

<RowDefinition Height="50"/>

<RowDefinition Height="30"/>

</Grid.RowDefinitions>

<Label

x:Name="UTLog"

Grid.Column="1"

Grid.Row="3"

Content="Логин"

Margin="0,6,5,6" Height="28" Width="54"

/>

<TextBox

x:Name="ULogin"

Grid.Column="2"

Grid.Row="3"

HorizontalContentAlignment="Center"

VerticalContentAlignment="Center"

/>

<Label

x:Name="UTPas"

Grid.Column="1"

Grid.Row="4"

Content="Пароль"

/>

<PasswordBox

x:Name="UPassword"

Grid.Column="2"

Grid.Row="4"

HorizontalContentAlignment="Center"

VerticalContentAlignment="Center"

Margin="5"

FontFamily="Consolas"

FontSize="16"

FontWeight="Bold"

/>

<Button

x:Name="ButtonLogIn"

Content="Войти в систему"

Grid.Column="1"

Grid.Row="5"

Grid.ColumnSpan="2"

Click="ButtonLogIn_Click"

/>

</Grid>

</Window>

Данный блок программного обеспечения реализует авторизацию пользователя в системе на основе фактора «I Know» - пароль пользователя. Тут представлена отрисовка приветственного окна «Авторизация» и логика взаимодействия с программой. У пользователя запрашивается логин и пароль. Управление передается из окна авторизации к модулю подключения.

Приложение 4

Панель администратора системы

AdmMenu.xaml.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

using System.Data.SqlClient;

namespace LogConAdm

{

/// <summary>

/// Логика взаимодействия для Adm.xaml

/// </summary>

public partial class AdmMenu : Window

{

public static SqlConnection Con; public AdmMenu()

{

InitializeComponent();

this.Owner.Close();

}

public AdmMenu(string str, SqlConnection conn)

{

InitializeComponent();

HelloMessage.Text += ", " + str + '!';

Con = conn;

}

private void CloseApp_Click(object sender, RoutedEventArgs e)

{

Environment.Exit(0);

}

private void Button_Users_Click(object sender, RoutedEventArgs e)

{

UserDesc a = new UserDesc(Con);

a.Owner = this;

this.Hide();

a.Show();

}

}

}

AdmMenu.xaml

<Window x:Class="LogConAdm.AdmMenu"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:LogConAdm"

mc:Ignorable="d"

Title="Administration Account"

FontFamily="Consolas"

FontWeight="Bold"

FontSize="14"

Width="400"

Height="300"

MinWidth="300"

MinHeight="200">

<Window.Resources>

<Style TargetType="Label">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="16"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

<Setter Property="HorizontalAlignment" Value="Right"/>

<Setter Property="VerticalAlignment" Value="Center"/>

</Style>

<Style TargetType="TextBlock">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="16"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

<Setter Property="HorizontalAlignment" Value="Stretch"/>

<Setter Property="VerticalAlignment" Value="Top"/>

<Setter Property="TextWrapping" Value="Wrap"/>

</Style>

<Style TargetType="Button">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="16"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

<Setter Property="Background" Value="WhiteSmoke"/>

</Style>

<Style TargetType="TextBox">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="14"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

</Style>

</Window.Resources>

<Grid>

<Grid.ColumnDefinitions>

<ColumnDefinition/>

<ColumnDefinition Width="150"/>

</Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition/>

<RowDefinition Height="40"/>

</Grid.RowDefinitions>

<TextBlock

x:Name="HelloMessage"

Grid.Column="0"

Grid.Row="0"

Text="Добро пожаловать"

Margin="10,10,10,0"

/>

<ToolBarPanel Grid.Column="1" Grid.Row="0">

<Button

x:Name="Button_Departments"

Content="Департаменты"

/>

<Button

x:Name="Button_Users"

Content="Пользователи"

Click="Button_Users_Click"

/>

<Button

x:Name="Button_Tables"

Content="Таблицы"

/>

</ToolBarPanel>

<Button

x:Name="CloseApp"

Grid.Column="1"

Grid.Row="1"

Content="Выход"

Margin="5"

Click="CloseApp_Click"

/>

</Grid>

</Window>

Данный блок программного обеспечения отвечает за панель управления администратора системы. Если при подключении пользователь авторизовался как администратор, то управление передается на это программный код. Тут представлена отрисовка окна «Admin Desktop» и логика взаимодействия с программой.

В данной версии на панели предусмотрены кнопки, и место под новости системы, возможны дальнейшие доработки. Например, при активации кнопки «Пользователи», управление передается на окно с полным перечнем всех пользователей и меню, в котором можно инициировать изменения базы пользователей (добавить, редактировать, удалить и т.д.).

Приложение 5

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

UserDesc.xaml.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

using System.Data.SqlClient;

namespace LogConAdm

{

/// <summary>

/// Логика взаимодействия для Window1.xaml

/// </summary>

public partial class UserDesc : Window

{

public static SqlConnection conn;

public UserDesc()

{

InitializeComponent();

}

public UserDesc(SqlConnection Con)

{

InitializeComponent();

conn = Con;

}

private void CloseApp_Click(object sender, RoutedEventArgs e)

{

Environment.Exit(0);

}

private void Menu_Click(object sender, RoutedEventArgs e)

{

this.Owner.Show();

this.Close();

}

private void Add_Click(object sender, RoutedEventArgs e)

{

NewUser a = new NewUser(conn);

a.Owner = this;

this.Hide();

a.Show();

}

private void Del_Click(object sender, RoutedEventArgs e)

{

InitializeComponent();

conn = Con;

this.Owner.Show();

this.Close();

}

}

}

UserDesc.xaml

<Window x:Class="LogConAdm.UserDesc"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:LogConAdm"

mc:Ignorable="d"

Title="Desctop - Users"

FontFamily="Consolas"

FontWeight="Bold"

FontSize="14"

Width="400"

Height="300"

MinWidth="300"

MinHeight="200">

<Window.Resources>

<Style TargetType="Label">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="16"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

<Setter Property="HorizontalAlignment" Value="Right"/>

<Setter Property="VerticalAlignment" Value="Center"/>

</Style>

<Style TargetType="TextBlock">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="16"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

<Setter Property="HorizontalAlignment" Value="Stretch"/>

<Setter Property="VerticalAlignment" Value="Top"/>

<Setter Property="TextWrapping" Value="Wrap"/>

</Style>

<Style TargetType="Button">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="16"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

<Setter Property="Background" Value="WhiteSmoke"/>

</Style>

<Style TargetType="TextBox">

<Setter Property="Margin" Value="5"/>

<Setter Property="FontSize" Value="14"/>

<Setter Property="FontFamily" Value="Consolas"/>

<Setter Property="FontWeight" Value="Bold"/>

</Style>

</Window.Resources>

<Grid>

<Grid.ColumnDefinitions>

<ColumnDefinition/>

<ColumnDefinition Width="100"/>

<ColumnDefinition Width="100"/>

</Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition/>

<RowDefinition Height="40"/>

</Grid.RowDefinitions>

<TextBlock

Text="Все пользователи"

Grid.ColumnSpan="2"

/>

<ToolBarPanel Grid.Column="2" Grid.Row="0">

<Button

x:Name="Add"

Content="Добавить"

Click="Add_Click"

/>

<Button

x:Name="Del"

Content="Удалить"

Click="Del_Click"

/>

</ToolBarPanel>

<Button

x:Name="Menu"

Grid.Column="1"

Grid.Row="1"

Content="Назад"

Margin="5"

Click="Menu_Click"

/>

<Button

x:Name="CloseApp"

Grid.Column="2"

Grid.Row="1"

Content="Выйти"

Margin="5" Click="CloseApp_Click"

/>

</Grid>

</Window>

Данный блок программного обеспечения отвечает за панель управления пользователями системы. Перейти в этот модуль можно только с панели администратора. Тут представлена отрисовка окна «Desktop - Users» и логика взаимодействия с программой.

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

Приложение 6

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

NewUser.xaml.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Data.SqlClient;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

namespace LogConAdm

{

/// <summary>

/// Логика взаимодействия для NewUser.xaml

/// </summary>

public partial class NewUser : Window

{

public static SqlConnection conn;

public NewUser()

{

InitializeComponent();

}

public NewUser(SqlConnection Con)

{

InitializeComponent();

conn = Con;

}

private void UMan_Checked(object sender, RoutedEventArgs e)

{

UFem.IsChecked = false;

}

private void UFem_Checked(object sender, RoutedEventArgs e)

{

UMan.IsChecked = false;

}

private void Exit_Click(object sender, RoutedEventArgs e)

{

UserDesc a = new UserDesc(conn);

a.Owner = this.Owner.Owner;

this.Owner.Close();

a.Show();

this.Hide();

}

private void ButtonLogIn_Click(object sender, RoutedEventArgs e)

{

string sqlExpression = "dbo.p_addlogin";

object result = null;

string name_user = USurname.Text + ' ' + UName.Text;

SqlCommand command = new SqlCommand(sqlExpression, conn);

command.CommandType = System.Data.CommandType.StoredProcedure;

SqlParameter loginParam = new SqlParameter

{

ParameterName = "@loginame",

Value = NULogin.Text

};

command.Parameters.Add(loginParam);

SqlParameter userParam = new SqlParameter

{

ParameterName = "@name",

Value = name_user

};

try

{

result = command.ExecuteScalar();

}

catch (Exception er)

{

Console.WriteLine("Error: " + er.Message);

Err a = new Err(er.Message);

a.Show();

}

Console.WriteLine("Add user " + NULogin + " with name "

+ name_user + ". ID = " + result + '\n');

UserDesc ret = new UserDesc(conn);

ret.Owner = this.Owner.Owner;

this.Owner.Close();

ret.Show();

this.Hide();

}

}

}

NewUser.xaml

<Window x:Class="LogConAdm.NewUser"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:LogConAdm"

mc:Ignorable="d"

Title="Add new user"

FontFamily="Consolas"

FontWeight="Bold"

FontSize="14"

Width="500"

Height="400"

MinWidth="300"

MinHeight="300">

<Window.Resources>

<Style TargetType="Label">

<Setter Property="Margin" Value="1"/>

<Setter...


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.