2009-09-27 2 views
5

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

Обнаружено, что KDE library, но у него слишком большая зависимость, и я слишком новичок программист, чтобы понять, как его использовать.

Каковы общие методы хранения паролей и как я могу решить свою проблему?

ответ

7

Это зависит от того, что вы собираетесь делать с информацией.

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

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


Night Walker комментарии:

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

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

Прежде всего, это означает, что соли и хеши не актуальны; вам нужно отменить операцию маскировки, и вы не можете изменить хеш.

Затем вам нужно решить, как вы будете идентифицировать пользователя своего приложения при повторном появлении. Будет ли пользователь обязан вводить пароль для доступа к своим собственным данным или просто полагаться на привилегии операционной системы или какую-либо другую схему.

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

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

mkdir ~/.appname 
chmod 700 ~/.appname 
cp /dev/null ~/.appname/app.key 
...store the encrypted information... 
chmod 500 ~/.appname 
chmod 400 ~/.appname/app.key 

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

+0

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

+0

, так что я вижу, что это постоянная запись - лучшая идея до сих пор. Приложение не имеет никаких других паролей, и оно не учитывает, что другие пользователи будут использовать это приложение. Единственное, что нужно сделать, это сохранить пароль + имя пользователя из другого ppl. –

+0

Да, потребуется хранить информацию в каком-то постоянном файле. Используйте отдельный файл для каждого пользователя приложения; хранить зашифрованный пароль в кодировке Base-64 (так что у вас есть текстовый файл). Выведите ключ, используемый для шифрования из криптографического хеша, который вы считаете наиболее надежными характеристиками пользователя (возможно, объединение имени пользователя и идентификатора пользователя и, возможно, фиксированного текста), и сохраните это как безопасное местоположение, которое вы можете придумать. Безопасность менее совершенна - то, что вы можете придумать своим нападающим, может обнаружить. –

0

Какое приложение это приложение? Существует много методов, но если его ASP.Net является общим для шифрования в файле web.config.

+0

Это кроссплатформенное приложение C++ (не какой-либо веб-апплет) –

5

Обычно вы храните имя пользователя и хешированную версию пароля. См. Эту статью в википедии: hash functions, и это question.

+2

Хэш пароля не поможет, если вам нужно использовать фактический пароль позже для входа в удаленную систему или что-то в этом роде. –

+0

Абсолютно ..... – Peter

1

насчет MySQL или SQLite Hash пароль и хранить их в постоянной базе данных, не

1

Common.? метод хранения паролей для последующего использования заключается в том, чтобы хранить их в некотором зашифрованном кеше.Этот кеш зашифрован с использованием какого-либо главного пароля. Пользователь должен вводить главный пароль каждый раз, когда вам нужен пароль из кеша. KeePassX - это небольшое приложение с открытым исходным кодом, которое использует мастер-пароль для хранить личные данные (имена пользователей, p и т. д.). Он имеет легкий интерфейс, является кросс-платформенным и опубликован в соответствии с GNU General Public License. Вы можете проверить его как образец и использовать некоторые его части.

0

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

+0

хороший веб-сайт, но вы пропустили много серий caprica, battlestar galactica, сыновья анархии и т. Д. –

+0

Хм, нет, мы не? –

1

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

1

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

Смежные вопросы