#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:
- Имейте некоторые инварианты для каждого пользователя, которые будут использоваться для генерации закрытого ключа: идентификатор пользователя, дата создания учетной записи, некоторая случайно сгенерированная соль…
- Напишите функцию хеширования, которая сгенерирует закрытый ключ.
- Запутать код функции.
Это не идеально, поскольку люди, имеющие доступ к коду и базе данных, смогут расшифровать данные, но это должно быть безопасно от утечек базы данных и не иметь проблем, о которых вы упоминаете.
Единственное безопасное решение, которое я могу придумать, — это заставить пользователей генерировать свои собственные закрытые ключи и шифровать данные на стороне клиента, а затем отправлять зашифрованные данные на сервер. В противном случае, если на сервере есть инструменты, необходимые для расшифровки, у кого-то с полным доступом к системе всегда найдется способ расшифровать конфиденциальные данные.
Я не эксперт в этом вопросе и, пожалуйста, скажите мне, если я ошибаюсь.