Подтвердить что ты не робот

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

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

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

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

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

EDIT:

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

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

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

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

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

EDIT2:

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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