Если я правильно интерпретирую ваш вопрос, то вы хотите, в основном, распространять ваше приложение среди пользователей, разрешать им запускать его и обновлять вашу базу данных. В то же время вы хотите, чтобы этот человек не мог войти в базу данных и использовать ее непосредственно.
Если ваша программа может быть декомпилирована (например, Java, но я не знаю о других языках, таких как C, C ++), то человек, который имеет ваше приложение, сможет увидеть исходный код. Как только они это получат, наверняка найдется способ узнать имя пользователя и пароль. Даже если ваш исходный код сохранил пароль с использованием обратимого алгоритма шифрования, человек, который хранит ваш исходный код, сможет написать код, аналогичный вашему, чтобы отменить шифрование и обнаружить пароль.
Даже если ваше приложение не может быть декомпилировано, пользователь может иметь возможность перехватить сетевые пакеты, которые он отправляет в базу данных, и определить пароль для этого. Я не знаю, можете ли вы общаться с базой данных через SSL.
Вместо этого я считаю, что вам нужно разделить ваше приложение на клиентские и серверные приложения. Вы можете написать спокойное веб-приложение или использовать службу обмена сообщениями (например, JMS) и написать клиентское приложение, которое его использует.
В этом случае вы можете захотеть или не захотеть иметь учетные записи пользователей, управляемые вашим приложением на стороне сервера. Позвольте мне пояснить: я говорю не об учетных записях базы данных, а об учетных записях, которыми управляет ваше приложение и чьи данные хранятся в базе данных. Если вы создаете учетные записи пользователей, вы можете следовать шаблону в моем исходном ответе, показанном ниже.
============== Подход хеширования, мой оригинальный ответ ============
Как уже упоминали другие, лучше добавить соль в пароль и использовать алгоритм дайджеста, прежде чем сохранять пароль в своей базе данных. Тем не менее, я думаю, что немного больше деталей в порядке.
Использование SHA1 или SHA2 со значением соли может быть довольно сильным, но есть даже более сильные методы. Я настоятельно рекомендую вам прочитать этот раздел руководства по безопасности пружины . Я не думаю, что вы используете Spring или Java, но этот раздел очень хорошо охватывает концепции. Позвольте мне перефразировать:
- Используйте как минимум 8-байтовое значение соли, было бы здорово до 16 байт. Значение соли должно быть разным для каждого аккаунта. Если он одинаков, взломщику нужно будет создать только один радужный стол! Это должно быть случайно сгенерировано. В документации об этом не говорится, но я также рекомендую использовать безопасный генератор случайных чисел, не используйте начальное число случайных чисел, которое дает последовательную последовательность чисел.
- Вы должны хешировать пароль несколько раз, потому что это приведет к тому, что попытки взлома паролем будут занимать все больше времени. Действительно, вам может потребоваться медленный алгоритм кодирования паролей вместо быстрого.
- Храните сырое значение соли в базе данных вместе с паролем, вы даже можете сохранить его в том же поле / столбце. Это необходимо, чтобы пароли можно было проверить в будущем.
Хороший пример этого - BCryptPasswordEncoder .
===============
Один альтернативный подход, который может решить, а может и не решить вашу проблему, - это создать учетную запись базы данных с ограниченными правами. Например, вы можете создать учетную запись базы данных, которая может выбирать, обновлять, вставлять и удалять только определенные таблицы в вашей базе данных. Возможно, вы не сочтете это приемлемым, потому что вы можете не захотеть, чтобы люди выполняли эти операции напрямую, в то время как вы можете позволить приложению выполнять эти операции. Это зависит от вашей конкретной ситуации.