Вопрос

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

Это было полезно?

Решение

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

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

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

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

Это код, который будет хешировать за вас несколько байтов.Вы можете легко извлечь байты из строки, используя 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();
    }

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top