Где хранить пароль хранилища ключей? - PullRequest
0 голосов
/ 04 октября 2018

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

Можно ли пройти аутентификацию в хранилище ключей как текущая учетная запись, поэтому пароли не используются?

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

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

1 Ответ

0 голосов
/ 04 октября 2018

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

Пример: веб-браузеры, как правило, предлагают функцию хранения паролей веб-сайта.Эти пароли хранятся в файлах, и с помощью правильных инструментов вы можете открыть эти файлы и увидеть пароли как день.Это невозможно исправить с помощью большего количества программного обеспечения или криптографических алгоритмов.Единственное решение состоит в том, чтобы сделать программное обеспечение неспособным разблокировать указанное хранилище данных, например, требуя, чтобы пользователь вводил мастер-пароль каждый раз, когда он хочет в него заглянуть, или помещая какой-либо безопасный анклав в аппаратное обеспечение и принимая ЭТО, заботясь окрипто.Java обычно не имеет нужных библиотек для взаимодействия с таким оборудованием (Apple T2 - очень продвинутый подход к этой концепции; чипы TPM - бюджетный вариант).

Итак, как только вы согласитесь с этим, вывсе еще может идти: Хорошо, хорошо, я не хочу ключи аутентификации в исходном коде;для того, чтобы построить продукцию, распространяемую из источников, застройщику придется ее поставлять.Для этого:

(при условии структуры проекта в стиле maven):

  1. Создайте файл src/main/resources/com/yourcompany/yourproject/keys/KeyFile.txt, а затем обновите файл .gitignore, чтобы игнорировать это, поместив /src/main/resources/com/yourcompany/yourproject/keys/KeyFile.txt втам.
  2. Запишите ключ в этот файл.Поделитесь этим файлом всеми безопасными средствами со всеми участниками проекта, которые должны его иметь.
  3. Запись кода: в 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, он имеет лучшие вызовычтобы сделать это, и вы должны использовать их).

...