Какова лучшая практика для безопасного хранения паролей в Java
Каков рекомендуемый способ хранения паролей в настольном приложении Java?
Я хочу, чтобы у пользователя была возможность ввести учетные данные только один раз и больше не запрашиваться.
В личных проектах я использовал Preferences API, но я предполагаю, что это ничем не отличается от хранения его в виде простого текста (с точки зрения безопасности).
Большое спасибо
РЕДАКТИРОВАТЬ:
Большое спасибо за ваши предложения. Кажется, есть некоторая путаница, без сомнения, потому что я, возможно, не сделал вопрос очень ясным...
Я приведу гипотетический сценарий:
Скажем, я создаю простой интерфейс для удаленной базы данных, который создает строку подключения с именем пользователя / паролем. Обычно пользователю будет предложено вводить комбинацию имени пользователя и пароля при каждом запуске приложения.
Что было бы лучшим способом сохранить этот пароль на компьютере пользователя, без необходимости повторного ввода его (подключение автоматически при запуске приложения).
Этакая функциональность "помни меня" (которую я знаю сама по себе не очень хорошая практика...)
EDIT2:
Спасибо всем за ответы. Пауло Эберманн был очень информативен о существующих проблемах, и связь Криса Смита была интересной, но я согласился с Джерверри, так как хранилища ключей могут быть маршрутом, по которому я иду.
3 ответа
Вы можете использовать локальное хранилище ключей, где вы можете поместить пароли вместо секретных ключей.
Ответ для редактирования:
Keystores идеально подходят для ваших нужд. Если вам нужна дополнительная защита, вы можете попросить пользователя ввести один пароль для доступа ко всем паролям при запуске приложения. Затем вы можете защитить сохраненный пароль базы данных с помощью простого метода "соль-стрейч" (для создания ключа шифрования), используя тот пароль, который он использовал при запуске приложения.
Невозможно сохранить что-либо на компьютере таким образом, чтобы ваша Java-программа могла получить его (без ввода пользователем какого-либо пароля), но никакая другая программа (запущенная с той же учетной записью пользователя) на этом компьютере не может получить это.
Вы можете попытаться как-то зашифровать его и спрятать алгоритм дешифрования вместе с ключом дешифрования в вашей программе (криптография белого ящика), но тогда злоумышленнику просто нужно запустить вашу программу в отладчике, чтобы он мог расшифровать данные.
Вы можете использовать систему разрешений системы, но обычно это не поможет, если злоумышленник - это какая-то программа, работающая с той же учетной записью пользователя, что и ваша Java-программа (и может помочь еще меньше, если у злоумышленника есть root-доступ).
Лучше всего было бы сохранить пароль на USB-накопителе и попросить пользователя вынуть его, когда вы закончили его использовать, но если атакующая программа работает и наблюдает, пока вы читаете секрет с флешки, даже это делает нет помощи.
Независимо от языка, я думаю, что это применимо: http://codahale.com/how-to-safely-store-a-password/
В итоге, используйте хеш-функцию bCrypt.
API предпочтений зависит от реализации, зависящей от памяти, поэтому вы будете зависеть от поставщика JVM. Если это JVM от Sun / Oracle, получить данные просто. Однако если вы его хешируете и применяете приличную политику паролей, это будет очень безопасно. Исходный пароль будет очень сложно определить.