Какова лучшая практика для безопасного хранения паролей в Java - PullRequest
24 голосов
/ 11 августа 2011

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

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

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

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

EDIT:

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

Я приведу гипотетический сценарий:

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

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

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

EDIT2:

Спасибо за ваши ответы всем. У Пауло Эбермана была очень информативная информация о возникающих проблемах, и ссылка Криса Смита была интересной, но я согласился с ссылкой Джерверри, так как хранилища ключей могут быть маршрутом, по которому я иду.

Ответы [ 3 ]

10 голосов
/ 11 августа 2011

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

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

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

4 голосов
/ 11 августа 2011

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

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

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

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

0 голосов
/ 11 августа 2011

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

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

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

...