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




Нет, нет. Даже если вы его зашифруете, кто-то декомпилирует код, который его расшифровывает.
Есть несколько способов справиться с этим. Если вы можете найти способ, чтобы пользователь предоставил пароль для хранилища ключей при запуске приложения, наиболее подходящим способом было бы зашифровать все значения с помощью ключа и сохранить этот ключ в хранилище ключей. Интерфейс командной строки к хранилищу ключей осуществляется с помощью 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();
}
Хороший ответ, но не на его вопрос.
Думаю, тогда я не совсем понимаю вопрос.
Он хочет сохранить имя пользователя и пароль, которые приложение будет использовать для подключения к базе данных. Поэтому ему нужно иметь возможность преобразовать его обратно в открытый текст, прежде чем он подключится к базе данных.
Фактически, в базе данных должна храниться хешированная версия пароля. Единственный раз, когда пароль должен быть простым текстом, - это когда пользователь вводит его и когда администратор базы данных впервые устанавливает его.
В дополнение к шифрованию паролей, как описано выше, поместите любые пароли в отдельный файл свойств и при развертывании попытайтесь предоставить этому файлу максимально возможные заблокированные разрешения.
Например, если ваш сервер приложений работает в Linux / Unix как root, сделайте файл свойств пароля владельцем root с разрешениями 400 / -r--------.
Разве приложение не могло связаться с сервером по https и загрузить пароль, конечно, после аутентификации каким-либо образом?
Если вы дадите кому-то ключ и замок, он сможет дублировать ключ и получить доступ к замку без ключа, который вы дали им изначально. Если вы не предоставите ключ, невозможно помешать им получить его. Это также фундаментальный недостаток DRM.