Я написал веб-приложение на PHP, которое обрабатывает некоторые секретные данные, помещенные в одну таблицу базы данных. Все поля в этой таблице (за исключением идентификатора и даты создания) зашифрованы с помощью AES, поэтому никто, кто имеет доступ к этой базе данных, не сможет ее прочитать.
Я шифрую эти данные с помощью пароля пользователя. В базе данных нет ни одного простого пароля, только сумма SHA1, так что я могу это проверить. Однако мне нужен простой пароль для расшифровки данных пользователя, когда он вошел в систему, поэтому я сохраняю это значение в сеансе.
Это нормально для этой цели? Если нет, каковы хорошие модели, чтобы иметь дело с этим делом?
Я шифрую эти данные с помощью пароля пользователя
Если они меняют свой пароль, вам нужно все заново зашифровать. Посмотрите на что-то более статичное для ключа.
поэтому я храню это значение в сессии.
Сеанс не должен хранить информацию такого типа, так как любой другой, у кого есть веб-сайт на коробке (или любой другой способ получить доступ к коробке), может прочитать ее. Если ваш ящик использует что-то похожее на suPHP или phpSuExec (спросите у вашего хоста), вы можете поместить эти данные в каталог, к которому может иметь доступ только ваша учетная запись. Вы даже можете сохранить его обратно в базу данных (зашифровано, конечно).
Каковы хорошие модели для решения этого дела?
Если безопасность важна для вас, посвятите себя. Если вы не можете этого сделать, то хотя бы на сервере, который использует suPHP или phpSuExec или тому подобное, чтобы процессы вашего веб-сервера выполнялись под уникальным пользователем, чтобы можно было защитить любые данные, связанные с ключом шифрования.
so nobody who has got access to this database can read it
,
Сохраняя ваш пароль в сеансе, вы будете иметь много файлов сеанса в вашем /tmp
каталог (или где они хранятся …), содержащий пароли пользователей.
Мало того, что доступ к вашему серверу делает недействительным ваше первое утверждение (когда у вас есть доступ к серверу, у вас есть прямой доступ ко многим паролям), но кто-то, имеющий доступ к серверу — даже действительный администратор сервера, такой как вы, — может видеть пароли, которые он или она никогда не должен быть в состоянии видеть.
Так что нет, это не хорошо.
Возможным решением вашей проблемы было бы использование ключа шифрования для пользовательской информации, которая хранится на другом сервере, так что доступа к базе данных / одному серверу базы данных недостаточно. Тем не менее, это всего лишь мысль, вы можете получить лучший ответ на этот вопрос, например, https://security.stackexchange.com/