Это зависит от того, что вы собираетесь делать с информацией.
Если вы собираетесь использовать имя и пароль для доступа к какой-либо внешней службе (но при следующем запуске программы пользователю будет необходимо повторно ввести эту информацию), а затем сохранить их в некоторых переменных в порядке. Возможно, было бы разумно хранить их зашифрованными (по крайней мере, хранить зашифрованный пароль), чтобы они не были видны в дампах ядра или в эквиваленте. Когда требуется пароль, вы расшифровываете его, используете его и затем записываете, где хранилась расшифрованная версия (перетаскивая ее). (Примечание: в этом контексте хеширование не подходит, вы должны иметь возможность видеть пароль, и вы не можете отменить хэш.) Вы можете решить сохранить информацию вне программы (в файле на диске), но она не представляется необходимым. Обратите внимание, что в двоичном файле все еще будет храниться ключ шифрования (и алгоритм шифрования), а зашифрованные данные более случайны, чем среднее содержание вашей программы, поэтому действительно скрывать зашифрованный пароль на самом деле очень сложно (граничит с невозможным). Однако вы можете сделать это достаточно сложно, чтобы остановить всех, кроме самых решительных нападавших.
Если вы собираетесь хранить имя пользователя и пароль в качестве постоянной записи, чтобы вы могли проверить, что тот же пользователь обращается к информации в будущем, тогда вы должны использовать внешнее хранилище для программы; вы будете использовать простую базу данных, которая может быть простой, как простой текстовый файл, если вы решите разрешить любые проблемы параллелизма. В этом случае вы будете вводить пароль с некоторой солью, и вы будете хранить имя пользователя, соль и хешированный пароль таким образом, чтобы с учетом имени пользователя вы могли легко найти два других значения.
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
Это менее удовлетворительно, потому что даже если объединить фиксированный ключ с именем пользователя, скажем, есть вероятность, что кто-то может работать, что это ключ (и технология шифрования) и перепроектировать его. (Секретность зашифрованных данных зависит от ключей, когда ключ определяется программой, он также определяется определенным злоумышленником. Лучше всего на самом деле полагаться на пользователя, чтобы предоставить ключ (или пароль или передать фразу) во время выполнения, то программа ничего, что злоумышленник может использовать в автономном режиме, не хранить
Я использую этот пароль для доступа к некоторой веб-базе данных, поэтому мне нужно его сохранить в моем приложении после его ввода в первый раз. Вы уверены, что текстовый файл - это умная идея? –
, так что я вижу, что это постоянная запись - лучшая идея до сих пор. Приложение не имеет никаких других паролей, и оно не учитывает, что другие пользователи будут использовать это приложение. Единственное, что нужно сделать, это сохранить пароль + имя пользователя из другого ppl. –
Да, потребуется хранить информацию в каком-то постоянном файле. Используйте отдельный файл для каждого пользователя приложения; хранить зашифрованный пароль в кодировке Base-64 (так что у вас есть текстовый файл). Выведите ключ, используемый для шифрования из криптографического хеша, который вы считаете наиболее надежными характеристиками пользователя (возможно, объединение имени пользователя и идентификатора пользователя и, возможно, фиксированного текста), и сохраните это как безопасное местоположение, которое вы можете придумать. Безопасность менее совершенна - то, что вы можете придумать своим нападающим, может обнаружить. –