Защитить встроенный пароль

У меня есть файл свойств в java, в котором я храню всю информацию о моем приложении, такую ​​как имя файла изображения логотипа, имя базы данных, пользователь базы данных и пароль базы данных. Я могу сохранить зашифрованный пароль в файле свойств. Но ключ или парольную фразу можно прочитать из банки с помощью декомпилятора. Есть ли способ надежно сохранить проход db в файле свойств?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
0
1 632
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Нет, нет. Даже если вы его зашифруете, кто-то декомпилирует код, который его расшифровывает.

Если вы дадите кому-то ключ и замок, он сможет дублировать ключ и получить доступ к замку без ключа, который вы дали им изначально. Если вы не предоставите ключ, невозможно помешать им получить его. Это также фундаментальный недостаток DRM.

Adam Davis 18.11.2008 22:55
Ответ принят как подходящий

Есть несколько способов справиться с этим. Если вы можете найти способ, чтобы пользователь предоставил пароль для хранилища ключей при запуске приложения, наиболее подходящим способом было бы зашифровать все значения с помощью ключа и сохранить этот ключ в хранилище ключей. Интерфейс командной строки к хранилищу ключей осуществляется с помощью keytool. Однако в JSE есть API для программного доступа к хранилищу ключей.

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

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

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

Это код, который будет хешировать для вас несколько байтов. Вы можете легко получить байты из String, используя метод getBytes().

/**
     * Returns the hash value of the given chars
     * 
     * Uses the default hash algorithm described above
     * 
     * @param in
     *            the byte[] to hash
     * @return a byte[] of hashed values
     */
    public static byte[] getHashedBytes(byte[] in)
    {
        MessageDigest msg;
        try
        {
            msg = MessageDigest.getInstance(hashingAlgorithmUsed);
        }
        catch (NoSuchAlgorithmException e)
        {
            throw new AssertionError("Someone chose to use a hashing algorithm that doesn't exist.  Epic fail, go change it in the Util file.  SHA(1) or MD5");
        }
        msg.update(in);
        return msg.digest();
    }

Хороший ответ, но не на его вопрос.

Allain Lalonde 19.09.2008 19:34

Думаю, тогда я не совсем понимаю вопрос.

jjnguy 19.09.2008 19:37

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

Brian Matthews 19.09.2008 20:15

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

jjnguy 19.09.2008 21:01

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

Например, если ваш сервер приложений работает в Linux / Unix как root, сделайте файл свойств пароля владельцем root с разрешениями 400 / -r--------.

Разве приложение не могло связаться с сервером по https и загрузить пароль, конечно, после аутентификации каким-либо образом?

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