Безопасное хранение пользовательских данных в БД с помощью Symfony

#php #symfony #security #encryption

#php #symfony #Безопасность #шифрование

Вопрос:

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

         $passCode = base64_encode($this->get('session')->get('_pk'));

        if (strlen($passCode) <= 16) {
            $iv = str_pad($passCode, 16, '0');
        } else {
            $iv = substr($passCode, 0, 16);
        }

        $ciphertext = openssl_encrypt('whatevervalue',  'AES-256-CBC', $passCode, 0, $iv);

        $test = new Test();
        $test->setValue($ciphertext);
        ...
        $em->persist($test);
        $em->flush();
        ...
  

$passCode На самом деле это их пароль, который я ввожу в session var следующим образом:

SecurityListener.php

 <?php

namespace AppBundleListener;


use SymfonyComponentHttpFoundationSessionSession;
use SymfonyComponentSecurityHttpEventInteractiveLoginEvent;

class SecurityListener
{

public function __construct($security, Session $session)
{
    $this->security = $security;
    $this->session = $session;
}

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{

    $this->session->set('_pk', base64_encode($event->getRequest()->get('_password')));
}

}
  

2 Проблемы:

  • Хранение $passCode (не зная на самом деле так много о сеансах), возможно, является проблемой безопасности?

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

Может быть, так проще понять, чего я хочу здесь:

Я хочу зашифровать все данные в моей базе данных, которые пользователь сам вводит туда. Я хочу, чтобы это была «особенность», при которой даже администраторы не могли бы прочитать данные без ключа. Я знаю, что последнее возможно не на 100% (поскольку будут способы перехвата паролей / ключей, если вводить их через веб-интерфейс, но, по крайней мере, это требует некоторого изменения кода). Возможно ли что-то подобное вообще? Есть какие-нибудь проекты с открытым исходным кодом, на которые я могу взглянуть?

Спасибо!

Комментарии:

1. почему бы не попробовать использовать сериализацию / рассериализацию данных при хранении данных в базе данных.

2. Общая рекомендация: используйте безопасную библиотеку шифрования PHP вместо openssl_encrypt() . В частности, KeyProtectedByPassword вам будет интересно.

Ответ №1:

  1. Имейте некоторые инварианты для каждого пользователя, которые будут использоваться для генерации закрытого ключа: идентификатор пользователя, дата создания учетной записи, некоторая случайно сгенерированная соль…
  2. Напишите функцию хеширования, которая сгенерирует закрытый ключ.
  3. Запутать код функции.

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

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

Я не эксперт в этом вопросе и, пожалуйста, скажите мне, если я ошибаюсь.