Хранение паролей для пакетных заданий

У меня есть небольшая программа Java, которая использует веб-сервис, которому требуется авторизация. Таким образом, программа Java (которая должна запускаться с помощью планировщика задач Windows) должна иметь аргумент пользователя/пароля. Как я могу хранить их где-нибудь, чтобы они не лежали в файле в виде открытого текста?

До сих пор я пытался использовать runtime.getRuntime и CACLS, чтобы получить файл с открытым текстом, но изменить разрешения, чтобы его мог открыть только владелец (не сработало, не знаю почему).

Шифрование паролей не работает, потому что, если я передам хэш веб-сервису, веб-сервис просто «ошибается, что? Отказано, потеряйся», но если я использую шифрование с секретным ключом, вам нужен пароль для расшифровки пароля. и где мне это хранить. :П

Помощь? Пожалуйста? :)

Спасибо.


person Community    schedule 31.07.2009    source источник


Ответы (5)


Простой ответ:

Вы не можете сделать его полностью безопасным, но вы можете сделать его незначительно более безопасным.

Вы НЕ МОЖЕТЕ хэшировать пароль, потому что это предотвратит его использование вашей программой.

Вы МОЖЕТЕ поместить пароль в файл и защитить файл, используя разрешения ОС. Вам нужно будет разрешить процессу, выполняющему вашу программу, доступ на чтение. Это предотвращает просмотр пароля любым лицом без прав администратора.

Вы МОЖЕТЕ зашифровать пароль и предоставить ключ в своей программе. Это предотвращает случайное наблюдение за паролем теми, кто может прочитать файл, но не остановит (или даже сильно не замедлит) кого-либо, имеющего доступ к паролю и вашей программе.

Все остальное — более или менее театр.

person Chris Nava    schedule 31.07.2009

как я могу хранить их где-нибудь, чтобы они не лежали в файле в виде открытого текста?

Хранение без «файла» будет затруднено. В любом случае в какой-то момент вам нужно получить пароль из какого-то места.

  • Используйте симметричное шифрование для запутывания, чтобы быстрый хэш не раскрыл ваш пароль.
  • Используйте файловую систему ОС (только для чтения для пользователя, использующего программу, без доступа для всех остальных), чтобы защитить файл на локальном диске или поместить его на внешний диск (флеш-память).
person PeterMmm    schedule 31.07.2009

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

Для более сложного подхода вы можете создать демон, который позволяет вам вводить пароль, хранить его в зашифрованном виде в памяти и передавать этот зашифрованный текст в вашу Java-программу через IPC (сокет), после чего ваша программа расшифрует его для использования. Но я бы никогда этого не сделал... Хи-хи-хи...

person instcode    schedule 31.07.2009

Два вопроса:

  1. зачем вам хранить их вне программы? Почему бы не кодировать в вашей Java-программе (вам или пользователю нужно их изменить?)
  2. Можно ли хранить их снаружи, но зашифровав? Например, вы можете зашифровать с помощью открытого ключа и сохранить закрытый ключ в самой программе. Таким образом, видимость закодированной пары не должна иметь значения.

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

person Brian Agnew    schedule 31.07.2009

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

Настроить программу как службу можно довольно легко с помощью Java Service Wrapper.

person gizmo    schedule 31.07.2009
comment
Разве это не видно через таблицу процессов (если вы указываете ее как параметр командной строки) или через файл .conf оболочки службы? - person Brian Agnew; 31.07.2009
comment
Ну, насколько я знаю, файл .conf больше не нужен после запуска приложения, поэтому вы можете просто удалить файл полностью или только параметр. - person gizmo; 31.07.2009