Задание на программу:
Необходимо разработать программный продукт, представляющий собой Блокнот с двухфакторной авторизацией, один элемент из которой представляет собой графический ключ.
Описание программы:
Разработанная программа представляет из себя связку программы (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 и базой данных;
- отчёт по программе.
kostyaLem