Безопасное хранение конфиденциальных данных в базе данных

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

В принципе, у меня есть patient который хранит публичную (= нечувствительную) информацию о пациентах. Другая информация (например, имя, адрес) является частной и должна быть надежно сохранена. Я использую пару открытых / закрытых ключей, сгенерированную PHP OpenSSL и отправленную менеджером веб-сайта. Кодовая фраза известна только людям, которым разрешен доступ к личным данным (в основном, к поставщикам медицинских услуг). Я хотел бы сохранить их в другом столе. Первый вопрос : BLOB – лучший тип столбца (с MySQL) для хранения двоичных данных. Или я должен их преобразовать (например, с base64 ) и сохранить их в столбце VARCHAR ?

Моя таблица patient_secure_data выглядит так:

 id INT AUTO_INCREMENT
 patient_id INT (FOREIGN KEY to patient.id)
 ключ VARCHAR (63)
 данные BLOB
 env BLOB

Это таблица значений ключа, где значение запечатывается openssl_seal . Мне нужно сохранить третий параметр ( $env_keys ), чтобы иметь возможность расшифровать данные. Итак, второй вопрос : зачем мне это env_keys если у меня есть ключевая фраза частного ключа, когда я вызываю openssl_open ?

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

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

С Уважением,

Гийом.

Извините, если мой язык не совершенен, я не являюсь носителем английского языка … Надеюсь, я ясно дал понять.

1 – BLOB – мое предпочтение, потому что кодирование его на base64 увеличит как пространство, так и время обработки (так как вам придется также декодировать base64 перед расшифровкой)

2 – openssl_seal не дает вам ключа, который использовался для шифрования данных. Цель env_keys – хранить зашифрованную форму сгенерированного ключа. Когда вы вызываете openssl_open, вы даете ему этот ключ конверта и закрытый ключ, чтобы он расшифровывал ключ конверта. Частный ключ должен быть сопоставлен с открытым ключом, который использовался для генерации ключа конверта.

3- Если вашему закрытому ключу требуется кодовая фраза, то технически ваши данные относительно безопасны. Даже если у них есть ключ конверта и закрытый ключ, они не смогут его использовать … но насколько безопасна ваша кодовая фраза? Одно можно понять, что вы почти никогда не можете гарантировать полностью безопасную схему, но вы можете определенно сделать ее жесткой для хакеров. Используйте свое воображение здесь. Btw, ваша кодовая фраза в тексте в вашем коде?

  1. Все, что должно быть более 500chars, вероятно, должно быть blob (или clob).

  2. Что касается ключей, вы должны хранить только открытый ключ в своей публичной базе данных. Таким образом, вам не нужно беспокоиться о ком-либо (кодовая фраза или нет), позволяющем расшифровывать данные. Частная часть ключа должна храниться в чувствительной БД. Вам нужна только публичная часть для дешифрования данных, зашифрованных частной частью. Я бы не сохранил весь ключ (public + private) на диске сервера, содержащий нечувствительную информацию, поскольку это снижает безопасность ключа.