Во-первых, общее правило: если вы поставляете программное обеспечение, которое само по себе способно разблокировать какое-то «безопасное хранилище» (то есть, без участия сервера под вашим контролем или какого-либо другого оборудования под вашим контролем) ... невозможно скрыть эту информацию от владельца компьютера, на котором он работает .
Пример: веб-браузеры, как правило, предлагают функцию хранения паролей веб-сайта.Эти пароли хранятся в файлах, и с помощью правильных инструментов вы можете открыть эти файлы и увидеть пароли как день.Это невозможно исправить с помощью большего количества программного обеспечения или криптографических алгоритмов.Единственное решение состоит в том, чтобы сделать программное обеспечение неспособным разблокировать указанное хранилище данных, например, требуя, чтобы пользователь вводил мастер-пароль каждый раз, когда он хочет в него заглянуть, или помещая какой-либо безопасный анклав в аппаратное обеспечение и принимая ЭТО, заботясь окрипто.Java обычно не имеет нужных библиотек для взаимодействия с таким оборудованием (Apple T2 - очень продвинутый подход к этой концепции; чипы TPM - бюджетный вариант).
Итак, как только вы согласитесь с этим, вывсе еще может идти: Хорошо, хорошо, я не хочу ключи аутентификации в исходном коде;для того, чтобы построить продукцию, распространяемую из источников, застройщику придется ее поставлять.Для этого:
(при условии структуры проекта в стиле maven):
- Создайте файл
src/main/resources/com/yourcompany/yourproject/keys/KeyFile.txt
, а затем обновите файл .gitignore
, чтобы игнорировать это, поместив /src/main/resources/com/yourcompany/yourproject/keys/KeyFile.txt
втам. - Запишите ключ в этот файл.Поделитесь этим файлом всеми безопасными средствами со всеми участниками проекта, которые должны его иметь.
Запись кода: в src/main/java/com/yourcompany/yourproject/keys/ProjectKey.java
есть статический метод для получения ключа.Это выглядело бы примерно так:
public final class ProjectKey {
/* prevent instantiation */ private ProjectKey(){}
private static final String PROJECT_KEY = loadKey();
public static String getKey () {
if (PROJECT_KEY != null) return PROJECT_KEY;
throw new IllegalStateException(
"Key file not present; find somebody with the file and place in: " +
"src/main/resources/java/com/yourcompany/yourproject/keys/KeyFile.txt");
}
private static String loadKey() {
InputStream in = ProjectKey.class.getResourceAsStream("KeyFile.txt");
try {
return in == null ? null : new Scanner(in, "UTF-8").next();
} finally {
if (in != null) in.close();
}
}
}
Создайте каталог в вашем проекте под названием «ключи» или еще много чего.В файле .gitignore в корне поместите строку /keys
, чтобы убедиться, что они не переходят в управление исходным кодом.
Вам придется возиться с некоторыми плагинами инструментов сборки, если вы хотите, чтобы сборкипотерпеть неудачу, если файл отсутствует.Кроме того, вам придется обновить разделитель сканера, если «ключ» содержит пробелы (здесь я использую сканер как самый быстрый способ превратить входной поток в полную строку; если у вас есть, например, Guava, он имеет лучшие вызовычтобы сделать это, и вы должны использовать их).