Разработка менеджера паролей с функцией управления ключами аутентификации

Заказать уникальную дипломную работу
Тип работы: Дипломная работа
Предмет: Методы защиты информации
  • 62 62 страницы
  • 17 + 17 источников
  • Добавлена 21.06.2024
4 785 руб.
  • Содержание
  • Часть работы
  • Список литературы
Введение 2
Глава 1: Теоретические основы 4
1.1 Обзор технологий и инструментов 4
1.2. Анализ существующих решений 10
1.3. Теория безопасности данных 16
1.4 Архитектура и дизайн приложения 20
1.5 Методы генерации паролей 25
1.6 Хранение и защита данных 29
1.7. Java 34
1.8. Spring 35
1.9. MySQL 37
1.10.Hibernate 38
1.11.JavaFX 39
Глава 2: Практическая часть. 40
2.1. Файл hibernate.cfg.xml 40
2.2. Инструменты программного комплекса 40
2.3. Настройка базы данных 41
2.4. Запуск системы 44
2.5. Запуск сервера 44
2.6. Запуск клиента 46
Заключение 47
Использованная литература 49
Приложение. Листинг программного кода 50
Фрагмент для ознакомления

Создание базы данных и присоединение бэкапа базы к существующей:- открываем cmd от имени администратора;Рисунок 2 – Командная строка- с помощью команды cd открываем каталог bin сервера MySQL на сервере. Поумолчаниюоннаходится C:\Program Files\MySQL\MySQL Server 8.0\bin; Рисунок 3 – Команда cdподключаемся к серверу mysql и создаем нашу базу, в которую потом будем вливать наш бэкап бд. Например «test_info_1», но в нашем случае «password_manager»Рисунок 4 – Подключение к базе данных - пишем команду mysql –uroot –p и вводим пароль. Логин (напримерroot) и пароль вы пишете тот который создали при установке сервера mysql.Рисунок 5 – Создание базы данныхСоздали базу под именем «test_info_1», а в нашем случае «password_manager». То есть наша команда будет: “createdatabasepassword_manager;”- командой exit выходим из режима. Заливаем бэкап в нашу вновь созданную базу. Например бэкап лежит на диске C: поэтому команда будет следующая:Рисунок 6 – Восстановление БД из бэкапаMysql-uroot –p “имя базы которую создали” < расположение резервной копииДалее вводим пароль. Внимание, вместо covid_info.sql у нас должен быть password_manager.sql и он должен лежать в корневой диска С.Код должен выглядеть вот так - “mysql -uroot -ppassword_manager< c:/ password_manager.sql”Заходим в workbench и убеждаемся, что база создана.Рисунок 7 – Восстановленная из бэкапа БДИз рисунка 7 заметьте, что пароли хранятся в зашифрованном виде. Когда будете тестировать приложение, то убедитесь.2.4. Запуск системыИз соображений логики для начала следует запустить сервер, а потом клиенты. 2.5. Запуск сервераРазархивируем « Password_Manager»Открываем Intellij Idea Из IntellijIdea находим содержимое «Password_Manager» и открываем папку «Server»:Рисунок 8 – Выбираем проект «Server»Из проекта выбираем файл «ServerApplication», правой кнопкой мыши выбираем и нажимаем Если нет ошибок, то сервер запустится.Рисунок 9 – Успешно запущенный сервер.2.6. Запуск клиентаПо аналогии с сервером открываем папку «Client» и запускаем клиента.Рисунок 10 – Успешно запущенный клиентЗаключениеВо времена цифровой трансформации безопасность данных становится неотъемлемой частью любой информационной системы. В этом контексте создание приложения для управления и хранения криптографических ключей представляет собой актуальное и важное решение. В данном заключении мы рассмотрим все аспекты разработки приложения «Менеджер хранения ключей», начиная с выбора технологий и заканчивая тестированием и планами по дальнейшему развитию.Для реализации приложения были выбраны следующие технологии:1. Spring Framework: Использование Spring предоставило нам гибкий и мощный каркас для разработки корпоративных приложений. Spring Boot упростил настройку и конфигурацию благодаря своим автоконфигурационным возможностям.2. Java: Выбор языка программирования Java обоснован его универсальностью, высокими стандартами безопасности и поддержкой множества библиотек для работы с криптографией.3. Hibernate: Для управления базой данных использовался фреймворк Hibernate, предоставляющий простой и интуитивно понятный способ для ORM (Object-Relational Mapping)4. MySQL: Реляционная база данных MySQL была выбрана за ее надежность, масштабируемость и широкую поддержку сообществом.Архитектура приложения строится на основе микросервисного подхода и включает следующие основные компоненты:1. Контроллеры (Controllers): Отвечают за обработку HTTP-запросов и взаимодействие с бизнес-логикой.2. Сервисный слой (Service Layer): В этом слое реализуются основные бизнес-правила и логика приложения.3. Слой доступа к данным (Data Access Layer): На этом уровне происходит взаимодействие с базой данных через ORM Hibernate.В процессе разработки возникли следующие основные трудности и способы их решения:1. Производительность: в случае работы с большими объемами данных поддержка транзакций и оптимизация запросов с использованием кеширования.2. Безопасность: Постоянное обновление библиотек и фреймворков для предотвращения уязвимостей безопасности.3. Совместимость версий: Управление зависимостями с помощью maven и использование принципов совместимости обратных версий.Проект создания приложения менеджера хранения ключей оказался успешным и достиг поставленных целей. В будущем планируется дальнейшее развитие функционала, включая интеграцию с другими системами, а также внедрение новых методов шифрования и улучшение пользовательского интерфейса. Учитывая важность безопасности данных и удобства управления ключами, данное приложение имеет высокий потенциал для внедрения в различных корпоративных и государственных структурах. формыНачало формыНачало формыИспользованная литератураПрохоренок Н.А,JavaFX. СПб БХВ - Петербург, 2020. – 768 с.Крейг Уоллс. Spring в действии. – М.: ДМК Пресс, 2015. – 752 с.Cay S. Horstmann and Gary Cornell, Core Java Volume I--Fundamentals, 11th Edition, 2018. - 928 с.Karthik Appigatla. MySQL 8 Cookbook". Packt Publishing, 2018 году. - 502 с.БауэрК., КингГ., ГрегориГ. Java Persistence API и Hibernate. ДМК Пресс, 2019. – 652 с.Joshua Bloch, Effective Java. Addison-Wesley Professional, 2017. - 416 с.Кэти Сьерра, Берт Бэйтс. Изучаем Java. Эксмо, 2016. - 720 с.Brian Goetz, Java Concurrency in Practice. Addison-Wesley Professional, 2006. - 384 с.Herbert Schildt, Java: The Complete Reference, McGraw-Hill Education, 2018. - 1312 с.Scott Oaks, Java Performance: The Definitive Guide, O'Reilly Media, 2014. - 426 с.Paul Deitel and Harvey Deitel, Java: How to Program, Pearson, 2017. - 1232 с.Pratik Patel, Java Database Programming with JDBC, O'Reilly Media, 2000. – 300 с.Craig Walls, "Spring Boot in Action", Manning Publications, 2016. - 384 сПарлог Николай, Система модулей Java. СПб.: Питер, 2021. – 464 с.Мартин Р. Чистый код: создание, анализ и рефакторинг. СПб.: Питер, 2015. – 464 с.Karthik Appigatla. MySQL 8 Cookbook". Packt Publishing, 2018 году. - 502 с.Бауэр К., Кинг Г., Грегори Г. Java Persistence API и Hibernate. ДМК Пресс, 2019. – 652 с.Приложение. Листинг программного кодаСервер:package com.example.Server;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class ServerApplication {public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args);}}package com.example.Server;import com.example.Server.db.Password;import com.example.Server.password_manager.PasswordManager;import com.example.Server.returns.PasswordTemp;import com.example.Server.util.HibernateUtil;import org.hibernate.Session;import org.hibernate.Transaction;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;import java.util.List;@RestControllerpublic class ServerController {private final String SECRET_KEY = "ghfntyel789123jg";@GetMapping("/")private String getInfo() throws Exception {return "Менеджерпаролей";}@GetMapping("/setPassword/{resource}&{password}")private String setPassword(@PathVariable String resource, @PathVariable String password) { String encryptPassword = PasswordManager.encrypt(password, SECRET_KEY);Password passwordDB = new Password(resource, encryptPassword);writePassword(passwordDB); return "Парольуспешносохранен";}@GetMapping("/getPasswords")private List getPasswordTempsList() { List passwords = getPasswordsList();List passwordsTemp = new ArrayList<>(); for(Password password: passwords) { passwordsTemp.add(new PasswordTemp(String.valueOf(password.getId()), password.getResource(), PasswordManager.decrypt(password.getPassword(), SECRET_KEY)));}return passwordsTemp;}/** * МетодзаписываетвБДновыйпароль * @param password*/private void writePassword(Password password) { Transaction transaction = null; try (Session session = HibernateUtil.getSessionFactory().openSession()) {// Старттранзакцииtransaction = session.beginTransaction();// ДобавимвБДпарольsession.persist(password);// Коммиттранзакцииtransaction.commit();} catch (Exception e) {if (transaction != null) { transaction.rollback();} e.printStackTrace();} }/** * МетодвозвращаетизБДсписокпаролей * @return*/private List getPasswordsList() { List passwordsList = new ArrayList<>();Transaction transaction = null; try (Session session = HibernateUtil.getSessionFactory().openSession()) {// Старттранзакцииtransaction = session.beginTransaction();passwordsList = session.createQuery("from Password", Password.class).getResultList();// Коммиттранзакцииtransaction.commit();} catch (Exception e) {if (transaction != null) { transaction.rollback();} }return passwordsList;}}package com.example.Server.db;import jakarta.persistence.*;import lombok.Getter;import lombok.Setter;@Setter@Getter@Entity@Table(name = "password")public class Password {@Id @GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id")private int id;@Column(name = "resource")private String resource;@Column(name = "password")private String password; public Password() {}public Password(String resource, String password) {this.resource = resource; this.password = password;}}package com.example.Server.password_manager;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;public class PasswordManager {// Методдляполучения SecretKeySpec изстрокиprivate static SecretKeySpec getKey(String myKey) {byte[] key; try { key = myKey.getBytes("UTF-8");// Еслиключслишкомкороткий, заливаемегонулями (вреальнойжизнилучшепользоватьсябитовымимаскамииправильнымвыравниваниемдлиныключа)if (key.length != 16) {byte[] tmp = new byte[16];System.arraycopy(key, 0, tmp, 0, Math.min(key.length, 16));key = tmp;}return new SecretKeySpec(key, "AES");} catch (Exception e) {throw new RuntimeException("Error while getting key: " + e.toString());} }// Методдляшифрованиястрокиpublic static String encrypt(String strToEncrypt, String secret) {try { SecretKeySpec secretKey = getKey(secret);Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedBytes = cipher.doFinal(strToEncrypt.getBytes("UTF-8")); return Base64.getEncoder().encodeToString(encryptedBytes);} catch (Exception e) {throw new RuntimeException("Error while encrypting: " + e.toString());} }// Методдлярасшифровкистрокиpublic static String decrypt(String strToDecrypt, String secret) {try { SecretKeySpec secretKey = getKey(secret);Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)); return new String(decryptedBytes);} catch (Exception e) {throw new RuntimeException("Error while decrypting: " + e.toString());} }}package com.example.Server.returns;import lombok.Getter;import lombok.Setter;@Setter@Getterpublic class PasswordTemp {private String id; private String resource; private String password; public PasswordTemp() {}public PasswordTemp(String id, String resource, String password) {this.id = id; this.resource = resource; this.password = password;}}package com.example.Server.util;import org.hibernate.SessionFactory;import org.hibernate.boot.Metadata;import org.hibernate.boot.MetadataSources;import org.hibernate.boot.registry.StandardServiceRegistry;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;/** * КлассдлявзаимодействиясБД */public class HibernateUtil {private static StandardServiceRegistry registry; private static SessionFactory sessionFactory;/** * Методпредназначендляработысбазойданных * @return*/public static SessionFactory getSessionFactory() {if (sessionFactory == null) {try {// Create registryregistry = new StandardServiceRegistryBuilder().configure().build();// Create MetadataSourcesMetadataSources sources = new MetadataSources(registry);// Create MetadataMetadata metadata = sources.getMetadataBuilder().build();// Create SessionFactorysessionFactory = metadata.getSessionFactoryBuilder().build();} catch (Exception e) { e.printStackTrace(); if (registry != null) { StandardServiceRegistryBuilder.destroy(registry);} } }return sessionFactory;}public static void shutdown() {if (registry != null) { StandardServiceRegistryBuilder.destroy(registry);} }} com.mysql.cj.jdbc.Driver jdbc:mysql://localhost:3306/password_manager rewoly Marshmellow89 true update 4.0.0 org.springframework.boot spring-boot-starter-parent 3.2.5 com.example Server 0.0.1-SNAPSHOT Server Demo project for Spring Boot 17 org.springframework.boot spring-boot-starter-web org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.hibernate hibernate-core 6.1.7.Final mysql mysql-connector-java 8.0.32 org.springframework.boot spring-boot-maven-plugin ${project.parent.version} org.projectlombok lombok Клиент:package com.example.client;import javafx.application.Application;import javafx.fxml.FXMLLoader;import javafx.scene.Scene;import javafx.stage.Stage;import org.apache.log4j.BasicConfigurator;import java.io.IOException;public class ClientApplication extends Application {@Overridepublic void start(Stage stage) throws IOException { FXMLLoader fxmlLoader = new FXMLLoader(ClientApplication.class.getResource("main.fxml"));Scene scene = new Scene(fxmlLoader.load(), 600, 400);stage.setTitle("Менеджерпаролей");stage.setScene(scene);stage.show();}public static void main(String[] args) { BasicConfigurator.configure();launch();}}package com.example.client;import com.example.client.passwords.Password;import javafx.collections.FXCollections;import javafx.collections.ObservableList;import javafx.fxml.FXML;import javafx.fxml.Initializable;import javafx.scene.control.Button;import javafx.scene.control.TableColumn;import javafx.scene.control.TableView;import javafx.scene.control.TextField;import java.net.URL;import java.util.List;import java.util.ResourceBundle;import org.apache.log4j.Logger;import org.springframework.core.ParameterizedTypeReference;import org.springframework.http.HttpMethod;import org.springframework.http.ResponseEntity;import org.springframework.web.client.RestTemplate;public class ClientController implements Initializable {private Logger logger = Logger.getLogger(ClientController.class); private RestTemplate restTemplate = new RestTemplate(); private String url = "http://" + Variables.ip_server + ":" + Variables.port_server;//---------------------------------------------------------------------// //Вкладкапосмотретьпароли@FXMLprivate Button buttonGetPasswords = new Button();@FXMLprivate TableView tableViewGetPasswords = new TableView(); private ObservableList passwordsData = FXCollections.observableArrayList();@FXMLprivate TableColumn tableColumnId = new TableColumn("ID");@FXMLprivate TableColumn tableColumnResource = new TableColumn("Источник");@FXMLprivate TableColumn tableColumnPassword = new TableColumn("Пароль");//---------------------------------------------------------------------// //Вкладкадобавитьпароль@FXMLprivate TextField textFieldSetResource = new TextField();@FXMLprivate TextField textFieldSetPassword = new TextField();@FXMLprivate Button buttonSetPassword = new Button();//---------------------------------------------------------------------//@Overridepublic void initialize(URL url, ResourceBundle resourceBundle) {tableViewGetPasswords.setItems(passwordsData);tableColumnId.setCellValueFactory(CellData -> CellData.getValue().id);tableColumnResource.setCellValueFactory(CellData -> CellData.getValue().resource);tableColumnPassword.setCellValueFactory(CellData -> CellData.getValue().password);}/** * Методотправляетнасервердобавлениеновогопароля */@FXMLprivate void setButtonSetPassword() {if (!textFieldSetResource.getText().isEmpty() && !textFieldSetPassword.getText().isEmpty()) {try { String url_set_password = this.url + "/setPassword/" + textFieldSetResource.getText() + "&" + textFieldSetPassword.getText();ResponseEntity response = restTemplate.exchange(url_set_password, HttpMethod.GET, null, String.class);logger.info(response.getBody());textFieldSetResource.setText("");textFieldSetPassword.setText("");} catch (RuntimeException e) {logger.info(e);} } else {logger.info("Заполнитевсеполя");} }/** * Методзапрашиваетссерверасписокпаролей */@FXMLprivate void setButtonGetPasswords() {try { String url_get_passwords = this.url + "/getPasswords";ResponseEntity> response = restTemplate.exchange(url_get_passwords, HttpMethod.GET, null, new ParameterizedTypeReference>(){});passwordsData.clear();List passwords = response.getBody(); for (Password password: passwords) {passwordsData.add(password);} } catch (RuntimeException e) {logger.error(e);} }}Внимание.Есликлиентзапущеннадругоймашине, товместо localhost поставьте IP адресгдезапущенсервер.package com.example.client;public class Variables {public static String ip_server = "localhost"; public static String port_server = "8080";}package com.example.client.passwords;import javafx.beans.property.SimpleStringProperty;import javafx.beans.property.StringProperty;public class Password {public StringProperty id; public StringProperty resource; public StringProperty password; public Password(String id, String resource, String password) {this.id = new SimpleStringProperty(this, "id", id); this.resource = new SimpleStringProperty(this, "resource", resource); this.password = new SimpleStringProperty(this, "password", password);}public String getId() {return id.get();}public StringProperty idProperty() {return id;}public void setId(String id) {this.id.set(id);}public String getResource() {return resource.get();}public StringProperty resourceProperty() {return resource;}public void setResource(String resource) {this.resource.set(resource);}public String getPassword() {return password.get();}public StringProperty passwordProperty() {return password;}public void setPassword(String password) {this.password.set(password);}}

1Прохоренок Н.А, JavaFX. СПб БХВ - Петербург, 2020. – 768 с.
2Крейг Уоллс. Spring в действии. – М.: ДМК Пресс, 2015. – 752 с.
3Cay S. Horstmann and Gary Cornell, Core Java Volume I--Fundamentals, 11th Edition, 2018. - 928 с.
4Karthik Appigatla. MySQL 8 Cookbook". Packt Publishing, 2018 году. - 502 с.
5Бауэр К., Кинг Г., Грегори Г. Java Persistence API и Hibernate. ДМК Пресс, 2019. – 652 с.
6Joshua Bloch, Effective Java. Addison-Wesley Professional, 2017. - 416 с.
7Кэти Сьерра, Берт Бэйтс. Изучаем Java. Эксмо, 2016. - 720 с.
8Brian Goetz, Java Concurrency in Practice. Addison-Wesley Professional, 2006. - 384 с.
9Herbert Schildt, Java: The Complete Reference, McGraw-Hill Education, 2018. - 1312 с.
10Scott Oaks, Java Performance: The Definitive Guide, O'Reilly Media, 2014. - 426 с.
11Paul Deitel and Harvey Deitel, Java: How to Program, Pearson, 2017. - 1232 с.
12Pratik Patel, Java Database Programming with JDBC, O'Reilly Media, 2000. – 300 с.
13Craig Walls, "Spring Boot in Action", Manning Publications, 2016. - 384 с
14Парлог Николай, Система модулей Java. СПб.: Питер, 2021. – 464 с.
15Мартин Р. Чистый код: создание, анализ и рефакторинг. СПб.: Питер, 2015. – 464 с.
16Karthik Appigatla. MySQL 8 Cookbook". Packt Publishing, 2018 году. - 502 с.
17Бауэр К., Кинг Г., Грегори Г. Java Persistence API и Hibernate. ДМК Пресс, 2019. – 652 с.