Сохранение расшифрованного пароля

Я знаю, что был такой вопрос миллион раз, но я не смог найти ответ, который бы соответствовал моим потребностям.

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

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

Вопрос в том, как их хранить.

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

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

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

Есть ли лучший способ сделать это, чтобы сохранить эти данные для входа?

Если это важно для вас, приложение будет на PHP, а база данных - Oracle.

1 ответ

Я бы просто использовал симметричное шифрование. Стандартные шаги:

  • Получите симметричный ключ из предоставленного пользователем пароля (например, PBKDF2 или scrypt)
  • Зашифруйте данные, используя AES-128-CBC или лучше с хорошим случайным IV
  • HMAC результат (например, HMAC_SHA256) или просто используйте режим AES GCM

Сохраните IV+ зашифрованный текст +MAC в базе данных.

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

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

Другие вопросы по тегам