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

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

7 голосов
/ 19 сентября 2008

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

Ответы [ 6 ]

3 голосов
/ 19 сентября 2008

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

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

2 голосов
/ 19 сентября 2008

Вы храните хэш 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();
    }
1 голос
/ 19 сентября 2008

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

0 голосов
/ 19 сентября 2008

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

0 голосов
/ 19 сентября 2008

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

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

0 голосов
/ 19 сентября 2008

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

...