Редактирование зашифрованных данных в сеансе PHP - PullRequest
0 голосов
/ 15 февраля 2012

Я создаю менеджер паролей в PHP, где пользователь может хранить и получать доступ к набору паролей, используя мастер-пароль.База данных представляет собой простой XML-файл, зашифрованный с использованием mcrypt и сохраненный на диске.

Редактировать: Каждый пользователь имеет свой собственный файл базы данных.

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

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

Примечание : у меня нет root или физического доступа ксервер, на котором размещен проект, поэтому я не могу изменить конфигурацию.

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

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

Если кто-то просто извлек HDD во время сеанса, он может легко использовать этот пароль для открытия файла.

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

Первое, что вы можете сделать, это шифрование диска . Это на самом деле значительно повысит безопасность. Если кто-нибудь украл ваш жесткий диск с открытым паролем в сеансе, он не сможет прочитать его.

Чем использовать HTTPS ... Это должно быть обязательно при работе с паролями, и вся ваша инициатива бесполезна, если вы используете только HTTP.

В php ... Я не уверен, что вы можете сделать что-нибудь. Но когда вы используете https, вы можете сделать это:

  • хранить пароль в $pass
  • генерация временного случайного ключа шифрования ($rand)
  • хранить пароль в зашифрованном виде $rand (я использовал только XOR)
  • хранить $rand в $_COOKIE переменную
  • используйте значение $_COOKIE для расшифровки мастер-пароля при каждом запросе
* +1032 * Пример: * 1 033 *
$pass = 'iddqd';
$rand = 'abcde';
echo base64_encode( $pass^$rand); // CAYHFQE=
$_COOKIE['phrase'] = $rand;
$_SESSION['password'] = base64_encode( $pass^$rand);
unset( $pass);

// And on every other request:
$pass = $_COOKIE['phrase'] ^ base64_decode($_SESSION['password'])

Какая добавленная стоимость? Хранение пароля в виде простого текста зависит только от аутентифицированного доступа к диску.

Генерация временной фразы и сохранение ее в браузере пользователя (и только на стороне пользователя) заставляет ее полагаться на аутентифицированный доступ к диску + значение cookie, генерируемое при аутентификации пользователя (которое должно быть трудно подделать).

И еще одна вещь, вам не нужно беспокоиться об отправке фразы в каждом запросе (вы можете менять ее каждые 10-100-1000 запросов) при использовании https.

1 голос
/ 15 февраля 2012

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

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

Это решает много проблем безопасности. активно вредоносный веб-сервер все еще может поставить под угрозу безопасность, но только тогда, когда пользователь активно загружает начальную страницу с помощью JavaScript.Пассивный злоумышленник (даже если бы он всегда мог видеть всю системную память сервера) не сможет ничего сделать, чтобы поставить под угрозу безопасность.

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

0 голосов
/ 15 февраля 2012

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

$_SESSION['myKey'] = md5($_POST['userName'] .$_POST['password']); //create a hash based on multiple predictable criteria

... и затем используйте $ _SESSION ['myKey'] вместо пароля.Таким образом, когда вы можете держать их ключ в состоянии сеанса, не раскрывая его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...