Как сохранить адрес хоста, имя пользователя и пароль базы данных и другую защищенную информацию при кодировании приложения на Java для этого приложения?

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

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

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

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

А) Сначала я решил жестко закодировать их в исходном коде, чтобы никто не нашел и не понял. 1. Но всякий раз, когда я хочу использовать это приложение для другой базы данных. Это каждый раз, когда мне нужно изменить вышеуказанную информацию в исходном коде и перекомпилировать исходный код и дать окончательный JAR для клиента. 2. Один из моих друзей также сказал мне, что есть инструменты, которые преобразуют байт-код в исходный код, и любой может узнать эту информацию. Я не верю в эту возможность, но просто ради объяснения проблемы я упоминаю этот момент здесь.

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

Здесь я хочу спросить экспертов:] Являются ли вышеуказанные способы безопасными и соответствуют ли они промышленным стандартам? б] Есть ли другое очень безопасное и гибкое решение для вышеуказанной проблемы? Пожалуйста, объясни мне это. Если нет другого решения, то какое решение является безопасным и гибким в вышеуказанном случае.

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

3 ответа

Это не имеет большого смысла.

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

...или же...

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

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

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

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

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

Пример содержимого может быть:

myapp.db.username=foo
myapp.db.password=bar
myapp.db.dbname=some_db

etc

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

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

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

Другие вопросы по тегам