Подтвердить что ты не робот

Шифрование пароля, сохранение пароля в сеансе

Мне нужно сохранить пароль и использовать его снова. Я думаю, что это совсем не безопасно.

Сценарий:

Я хочу создать программу электронной почты, где пользователь вводит имя пользователя и пароль, а затем проверяет их электронную почту. Этот инструмент не предназначен для хранения паролей на db. Но в PHP нам нужно подключиться к почтовому серверу на каждой странице, к которой пользователь переходит. Поэтому для подключения к почтовому серверу требуется имя пользователя и пароль. Как это можно сделать самым безопасным способом?

4b9b3361

Ответ 1

Поскольку сохранение пароля не предназначено, но также необходимо повторно вводить пароль, много раз тоже нежелательно, единственное решение, которое я вижу, следующее:

  • Зашифровать пароль (используя, например, AES), с случайным ключом достаточной длины
  • Сохраните зашифрованный пароль и имя пользователя в сеансе
  • Наверное, нет ошибки шифровать имя пользователя и почтовый сервер, на всякий случай. Это не повредит, и предполагаемый злоумышленник не имеет известного имени пользователя на сервере.
  • Сохранить ключ шифрования в файле cookie

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

С каждым запросом пользовательский браузер отправляет cookie, PHP script может использовать файл cookie для дешифрования данных, хранящихся в сеансе, и выполнять запрос на сервере IMAP/POP.

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

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

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

Конечно, все это предполагает, что по крайней мере страница входа на ваш сайт (желательно все) предоставляется через https://, и вы используете TLS/SSL для связи с почтовыми серверами. В противном случае вы можете использовать гораздо более тривиальные атаки.