Задание на программу:
Необходимо разработать программный продукт, представляющий собой Блокнот с двухфакторной авторизацией, один элемент из которой представляет собой графический ключ.
Описание программы:
Разработанная программа представляет из себя связку программы (WinForms, C#) + локальная база данных (SQLite).
Методы шифрования:
Логин и пароль шифруются с помощью метода MD5 и хранятся в базе в таком же виде. Графический ключ в виде списка координат так же шифруется с помощью метода гаммирования и записывается в базу данных.
Содержание отчёта (12 страниц):
- Введение 3
- Цель работы 4
- Функциональные возможности 4
- Математические методы и алгоритмы решения задач 5
- Ограничения 5
- Руководство пользователя 6
- Алгоритм работы программы 8
- Результаты работы программы 10
- Выводы 12
Дополнительно:
При регистрации для каждого пользователя указывается картинка. по которой при авторизации он сможет ориентироваться куда нажимать. В случае, если координаты введены неверно, то программа не даст об этом знать, чтоб избежать подбора пароля. Подробное описание работы программы описано в отчёте.
При первом запуске может потребоваться пересобрать проект, чтобы подтянулись необходимы библиотеки. Нажать в верху студии в меню Средства -> Диспетчер пакетов NuGet -> Консоль диспетчера пакетов. Написать в открывшемся окне: update-package -reinstall. Можно использовать ))
Фрагмент программного кода:
private void btnReg_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(txtLogin.Text.Trim()))
{
MessageBox.Show("Введите логин");
return;
}
if (string.IsNullOrEmpty(txtPassword.Text.Trim()))
{
MessageBox.Show("Введите логин");
return;
}
if (_points.Count == 0)
{
MessageBox.Show("Заполните графический ключ");
return;
}
var login = Convert.ToBase64String(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(txtLogin.Text.Trim())));
var passwordHash = Convert.ToBase64String(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(txtPassword.Text.Trim())));
using (var command = _connection.CreateCommand())
{
command.CommandText = "SELECT * FROM 'User' WHERE Login = @login";
command.Parameters.Add("@login", DbType.String).Value = login;
var count = command.ExecuteScalar();
if (count == DBNull.Value || count == null || Convert.ToInt32(count) == 0)
{
var accutacy = (int)numAccuracy.Value;
var image = ImageToBytes(picKey.Image);
var data = Crypt.Gamming(JsonConvert.SerializeObject(new ImageData(accutacy, _points)), login);
// Insert image
command.CommandText = "INSERT INTO 'Image' (Image, Data) VALUES(@image, @data)";
command.Parameters.Add("@image", DbType.Binary).Value = image;
command.Parameters.Add("@data", DbType.String).Value = data;
command.ExecuteNonQuery();
command.CommandText = "select last_insert_rowid()";
var imageID = Convert.ToInt32(command.ExecuteScalar());
// Insert User with reference to Image
command.CommandText = "INSERT INTO 'User' (Login, PasswordHash, ImageID) VALUES(@login, @passwordHash, @imageID)";
command.Parameters.Add("@login", DbType.String).Value = login;
command.Parameters.Add("@passwordHash", DbType.String).Value = passwordHash;
command.Parameters.Add("@imageID", DbType.Int32).Value = imageID;
var result = command.ExecuteNonQuery();
MessageBox.Show($"Пользователь {txtLogin.Text} успешно зарегестрирован!");
this.Close();
}
else if (Convert.ToInt32(count) != 0)
{
MessageBox.Show("Пользователь с таким именем уже существует");
}
}
}
Скриншот архива с проектом:

Содержание архива:
- папка с исходным проектом в Visual Studio 2019 и базой данных;
- отчёт по программе.
Телеграм
-