Halite / Doctrine против MySQL AES_ENCRYPT: безопасность / производительность - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть веб-приложение (Symfony 4), которое должно быть совместимым с HIPAA, что (помимо прочего) означает, что мне необходимо шифровать данные.Первоначально я собирался зашифровать данные в PHP через Halite и сохранить их в базе данных, однако есть некоторые поля (фамилия, имя, номер телефона), которые я не могу зашифровать, потому что они будут использоваться для поля поиска и, следовательно,Мне нужно (?) MySQL, чтобы иметь возможность использовать предложения where.

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

Я продолжаю просматривать статьи, хотя это AES_ENCRYPT плохая идея, и все должно быть защищено в PHP.Если я сделаю это, мне нужно будет вытащить ВСЕ записи, расшифровать их, а затем выполнить поиск PHP - конечно, не так быстро, как это мог бы сделать MySQL (?).Эта таблица может содержать тысячи записей.

Есть ли какие-либо предложения для этого?Я обдумываю это?Какие риски были бы при этом через MySQL, если бы я делал соединения через ssh?

В интернете так много предложений, что трудно понять, что правильно = / Заранее большое спасибо!

1 Ответ

0 голосов
/ 13 сентября 2018

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

Если у вас есть таблица, скажите:

(id, first_name, last_name, email)

Сначала мы добавим дополнительные столбцы для полей, которые вы хотите зашифровать, поэтому наштаблица становится

(id, first_name, first_name_lu, last_name, last_name_lu, email)

Когда мы обновляем или вставляем строку, мы делаем 2 вещи:

  • Используя первый симметричный ключ, мы шифруем необходимые поля.Этот результат помещается в исходный столбец.
  • Используя второй симметричный ключ, мы HMAC требуемое поле.Этот результат помещается в столбец *_lu.

Когда мы хотим выполнить поиск, мы:

  • Используя второй симметричный ключ, HMAC поисковый запрос и затемищите столбец *_lu на основе результата.
  • Если мы находим совпадение, то зашифрованное значение в исходном столбце является искомым значением.

Вы можете удивитьсяпочему HMAC вообще необходим, почему мы не можем просто перешифровать и сравнить?Мы могли бы сделать это, но это также означало бы, что мы должны использовать режим ECB для шифрования, что является большой уязвимостью безопасности.Вместо этого следует использовать GCM или CBC.Это то, что делает HMAC необходимым.

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