Как насчет предоставления пользовательского механизма аутентификации N-фактора?
Перед объединением доступных методов, давайте предположим, что мы можем выполнить следующее:
1) Hard-код внутри программы Java
2) Хранить в .properties файл
3) Запрашивать ввести пароль из командной строки
4) Задать пользователю ввести пароль из формы
5) Попросите пользователя загрузить пароль-фай ле из командной строки или формы
6) обеспечивает пароль через сеть
7) много альтернатив (например, Draw секрет, отпечатков пальцев, IP-специфические, бла-бла-бла)
1 вариант: Мы могли бы сделать вещи более сложными для злоумышленника, используя обфускацию, но это не считается хорошей контрмерой. Хороший кодер может легко понять, как это работает, если он/она может получить доступ к файлу. Мы могли бы даже экспортировать двоичный файл для каждого пользователя (или просто часть обфускации или ключевую часть), поэтому злоумышленник должен иметь доступ к этому файлу, специфичному для пользователя, а не к другому дистрибутиву. Опять же, мы должны найти способ изменения паролей, например, путем перекомпиляции или использования отражения в режиме поведения на лету.
второй вариант: Мы можем сохранить пароль в файле .properties в зашифрованном виде, поэтому он не виден непосредственно от злоумышленника (так же, как jasypt делает). Если нам нужен менеджер паролей, нам понадобится мастер-пароль, который снова должен быть где-то сохранен - внутри.файл класса, хранилище ключей, ядро, другой файл или даже в памяти - все имеют свои плюсы и минусы.
Но теперь пользователи просто отредактируют файл .properties для смены пароля.
3-ая опция: введите пароль при запуске из командной строки, например. java -jar /myprogram.jar -p sdflhjkiweHIUHIU8976hyd
.
Это не требует сохранения пароля и останется в памяти. Однако команды history
и журналы OS могут быть вашим злейшим врагом. Чтобы изменить пароли «на лету», вам необходимо реализовать некоторые методы (например, прослушивать входные данные консоли, RMI, сокеты, REST bla bla bla), но пароль всегда будет оставаться в памяти.
Можно даже временно дешифровать его только при необходимости -> затем удалить дешифрованный, но всегда хранить зашифрованный пароль в памяти. К сожалению, вышеупомянутый метод не увеличивает защиту от несанкционированного доступа в памяти, потому что человек, который достигает этого, вероятно, получит доступ к алгоритму, соли и любым другим секретам.
4-й вариант: укажите пароль из пользовательской формы, а не из командной строки. Это обойдутся проблемой каротажа.
5-й вариант: предоставить файл как пароль, сохраненный ранее на другом носителе, -> затем файл жесткого удаления. Это снова обойдутся проблемой каротажа, а также не потребует типизации, которая может быть украдена плечом-серфингом. Когда требуется изменение, укажите другой файл, а затем снова удалите его.
6-й вариант: еще раз, чтобы избежать плеч-серфинга, можно реализовать вызов метода RMI, чтобы предоставить пароль (через зашифрованный канал) с другого устройства, например, с помощью мобильного телефона. Однако теперь вам необходимо защитить свой сетевой канал и получить доступ к другому устройству.
Я бы выбрал комбинацию вышеуказанных методов для достижения максимальной безопасности, поэтому вам нужно было бы получить доступ к файлам .class, файлу свойств, журналам, сетевому каналу, серфингу для плеч, мужчине посередине, другим файлам bla bla bla , Это можно легко реализовать с помощью операции XOR между всеми sub_passwords для создания фактического пароля.
Мы не можем быть защищены от несанкционированного доступа в память, но этого можно достичь только с помощью ограниченного доступа оборудования (например, смарт-карт, HSM, SGX), где все вычисляется в них, без кого-либо, даже законный владелец может получить доступ к ключам или алгоритмам дешифрования. Опять же, можно также украсть это оборудование, сообщается side-channel attacks, что может помочь злоумышленникам в извлечении ключей, а в некоторых случаях вам нужно доверять другой стороне (например, с SGX вы доверяете Intel). Конечно, ситуация может ухудшиться, когда будет возможно клонирование (де-сборка) в защищенном анклаве, но я думаю, это займет несколько лет, чтобы быть практичным.
Также можно рассмотреть решение для обмена ключами, в котором полный ключ разделяется между разными серверами. Однако после реконструкции полный ключ может быть украден. Единственный способ смягчить вышеупомянутую проблему - secure multiparty computation.
Мы всегда должны помнить о том, что независимо от метода ввода мы должны гарантировать, что мы не уязвимы от сетевых обнюхиваний (MITM-атак) и/или ключей-регистраторов.
Лучшее, на что вы можете надеяться, это obfustication, если программа может его прочитать, любой, у кого есть доступ к файлам, тоже может быть. Это не значит, что вы не можете получить доступ к ним. – lynks
Шифрование его постоянным паролем, который хранится в коде, кажется законным способом сделать это, если основная проблема связана с людьми, которые смотрят на плечо администратора. – ZeroOne
Сколько людей обращается к базе данных? Не нужен ли им пароль для доступа к основной базе данных? Зачем вам хранить второй или этот? –