Сохранение сохраненного пароля в приложении с открытым исходным кодом - PullRequest
12 голосов
/ 31 августа 2011

Я пишу приложение на C #, которое будет с открытым исходным кодом, и мне нужно иметь возможность хранить сохраненную информацию для входа в систему для каждого пользователя. Обычно я просто шифрую пароль и затем сохраняю его в файле настроек пользователя, но я беспокоюсь, что из-за того, что код является открытым исходным кодом, он как бы побеждает точку шифрования. Поскольку все, что кому-либо нужно, - это посмотреть на код и взять ключ шифрования.

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

РЕДАКТИРОВАТЬ: Уточнение ... Я храню пароли стороны КЛИЕНТА, а НЕ пароли для подтверждения своего логина для службы. Это клиент для уже существующего веб-сервиса, который я не могу контролировать. Я просто хочу хранить пароли локально для автоматического входа ... как любой чат-клиент.

РЕДАКТИРОВАТЬ 2: Полностью извините за то, что не было ясно до Но в какой-то момент пароли должны быть получены в виде открытого текста, и хэширование НЕ является опцией :( Даже если служба разрешит мне передать хэш пароля, это будет своего рода побеждать цель, потому что хэш будет так же хорош, как и пароль: P

Ответы [ 5 ]

7 голосов
/ 31 августа 2011

То, что вы спрашиваете, в принципе невозможно.

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

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

Это также напоминает мне о людях, жалующихся на то, что в Google Chrome легко обнаружить пароли ... Они, очевидно, не знают лучше. Вы можете попробовать все хитрые трюки, которые захотите, но любая защита приложения будет выброшена в окно, как только кто-то получит доступ к машине.

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

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

Если вы используете это приложение в Windows, вы можете использовать DPAPI для хранения конфиденциальных данных от имени пользователя:

Как: использовать DPAPI для шифрования и дешифрования данных (C # / VB.NET)

Хорошей идеей является также сохранение хеша вместо полного пароля!

1 голос
/ 31 августа 2011

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

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

Еще одна идея: Может быть, будет просто возможность оставить реализацию на усмотрение того, кто когда-либо собирается использовать ваш источник и сделать шифрованиеАннотация?Конечно, не работает, если вы предлагаете встроенный пакет для загрузки.Но опять же: в сборке вы можете использовать свое собственное «секретное» шифрование и по-прежнему иметь его в исходном виде.

0 голосов
/ 05 октября 2012

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

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

Возможно, вы можете зашифровать пароль, используя некоторые специфические для машины значения, например, mac или sth. Если кто-то получает исходный и зашифрованный пароль, но полный доступ к машинному паролю не должен быть безопасным.

...