Какова наилучшая практика безопасного хранения паролей в Java

каким будет рекомендуемый способ хранения паролей в настольном приложении Java?

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

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

большое спасибо

EDIT:

большое спасибо за ваши предложения. Кажется, здесь какая-то путаница, без сомнения, потому что я не очень ясно сформулировал вопрос...

Я дам сценарий hypotetical:

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

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

своего рода функциональность" Запомнить меня " (что я знаю сам по себе не очень хорошая практика...)

EDIT2:

Спасибо за ваши ответы всем. Paŭlo Ebermann был очень информативен о проблемах, и ссылка Криса Смита была интересной, но я принял один JVerstry, поскольку keystores может быть маршрутом, который я беру.

3 ответов


вы можете использовать локальное хранилище ключей, где вы можете поместить пароли вместо секретных ключей.

ответ на редактирование:

Keystores идеально подходят для ваших нужд. Если вам нужна дополнительная защита, вы можете попросить у пользователя один пароль для доступа ко всем паролям при запуске приложения. Затем вы можете защитить сохраненный пароль базы данных простым методом "соль и растяжка" (для создания ключа шифрования), используя один пароль, который он использовал при запуске приложение.


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

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

вы можете использовать систему разрешений системы, но это обычно не поможет, если злоумышленник-это какая-то программа, работающая в той же учетной записи пользователя, что и Ваша программа Java (и поможет еще меньше, если у злоумышленника есть root-доступ).

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


независимо от языка, я думаю, что это применимо:http://codahale.com/how-to-safely-store-a-password/

В общем, используйте хэш-функцию bCrypt.

API предпочтений зависит от реализации из памяти, поэтому вы будете во власти поставщика JVM. Если это JVM Sun / Oracle, тривиально получить данные. Если вы хэш его и вместе с тем применить политику приличный пароль, он будет очень безопасен. Оригинальный пароль будет очень трудно определять.