Зашифровать пароль для хранения

0

Я пишу небольшой инструмент в C++, и я запутался в том, как хранить зашифрованный пароль в текстовом файле. Я искал в Интернете. Популярный совет о хэшах:

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

Но мне нужно расшифровать пароль для обычного текста. Что мне делать? Любые советы, пожалуйста.

  • 2
    Зачем вам нужно расшифровывать пароль?
  • 1
    Если вам нужно вернуть пароль к простому тексту, вы не можете использовать хеш (с хешем вы не сохраняете сам пароль, поэтому его невозможно восстановить, поэтому он более безопасен: вы сравниваете хэши, но проверяете данные файл вы не увидите пароль, потому что его там нет). Какой алгоритм шифрования вы можете использовать, зависит от ваших требований безопасности ...
Показать ещё 2 комментария
Теги:
encryption

2 ответа

2
Лучший ответ

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

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

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

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

Помимо этого, это довольно просто, вы можете использовать любой готовый алгоритм. Поскольку криптографический алгоритм, безусловно, не будет самым слабым звеном в вашей цепочке безопасности, это не имеет большого значения, какой из них вы выберете. Разумеется, вы, конечно, еще не намеренно выбираете алгоритм тривиально-трещин, как простое xor-шифрование, но любой довольно серьезный алгоритм, такой как TEA, Blowfish или Twofish, или AES, будет очень хорош.
Я бы, наверное, просто выбрал TEA, так как это всего лишь полдюжины строк кода и в значительной степени хорош, так как "сохранить зашифрованный пароль открытого текста" можно получить в любом случае.

0

Основной принцип, описанный в комментариях:

Когда новый пользователь добавлен, пароль хешируется, и значение хеша сохраняется.

Когда пользователь пытается войти в систему, их пароль хешируется и сравнивается с сохраненным значением хэша.

Таким образом, в коде это будет:

void addNewUser(std::string name, std::string password)
{
    sometype hashValue = hashFunction(password);
    store(name, hashvalue); 
}

bool login(std::string name, std::string password)
{
    sometype hashValue = hashFunction(password);
    userdata = findUserData(name);
    if (userdata.hashValue == hashValue)
       return true;
    return false;
}

(Очевидно, что я проигнорировал некоторые сложности, например, проверив, что на самом деле есть пользователь с таким именем и т.д.)

Редактирование: Конечно, если вам нужно отправить пароль в виде простого текста, вам понадобится обратимая encrypption. Их тоже много.

Этот вопрос здесь охватывает общие алгоритмы шифрования (и упоминает хэши): алгоритмы Top Hashing и Encryption?

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню