Какой лучший способ использовать/хранить ключи шифрования в MySQL

Я планирую использовать MySQL и встроенные функции шифрования для шифрования/дешифрования определенных столбцов в определенных таблицах. Меня беспокоит то, что мне нужно где-то хранить ключ. Я мог бы, конечно, сохранить ключ в файле и управлять разрешениями этого файла и разрешениями приложения, которое обращается к нему, но этого достаточно? Я мог бы также создать веб-сервис, чтобы получить ключ или что-то в этом роде.

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

Я выглядел ad nauseum, но никто, кажется, не имеет пуленепробиваемого ответа.

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

Ответ 1

Я не уверен, что использование MySQL в шифровании будет лучшим решением вашей проблемы.

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

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

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

*) Другой вариант - ввести пароль при запуске веб-сервера и сохранить его только в памяти.

Возможное решение
Если рассматривается решение, использующее следующий метод шифрования файлов для пользователей с веб-доступом (я не уверен в вашей среде, но это может быть полезно):

  • После создания пользователя новому пользователю назначается длинный случайный ключ.
  • Этот случайный ключ хранится в зашифрованном столбце в записи пользователя.
    (только этот столбец зашифрован, чтобы не повлиять на производительность остальной части записи!)
  • Шифрование столбца случайной клавиши выполняется с помощью 1 мастер-пароля, хранящегося в файле или в памяти.
    (Лучший вариант - ввести пароль при просмотре веб-сервера и сохранить его только в памяти.)
    (Другой подход состоял бы в том, чтобы позволить пользователю ввести пароль и использовать его для шифрования/дешифрования столбца случайных ключей, но я не уверен, что это увеличит или уменьшит безопасность).
  • Каждый документ, который необходимо зашифровать, зашифровывается случайным ключом для этого пользователя, а затем сохраняется на диске.
  • Документы хранятся с минимальными разрешениями в файловой системе.

Преимущества этого подхода:
1. Случайный ключ зашифровывается в базе данных. Таким образом, у вас все еще есть дополнительная безопасность сервера базы данных в сочетании с зашифрованным столбцом. 2. Документы хранятся с разными ключами, если злоумышленник получает ключ, только часть документов скомпрометирована.

Однако:
Если злоумышленник получает главный пароль и имеет доступ для чтения к таблице пользователя, вся система еще раз нарушена.

Ответ 2

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

Ваш веб-интерфейс script не должен открывать файлы файловой системы, используя переменные, особенно пользовательские. Даже не дайте им возможность проскользнуть что-то, прошедшее через ваш входной фильтр (вы правильно фильтруете данные, предоставленные пользователем?) И, возможно, отказались от содержимого ключевого файла. Храните пути к жестко запрограммированным строкам и определяйте(). Поскольку большинство ваших данных хранится в MySQL, это не должно быть проблемой.

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

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

Ответ 3

Кажется, что вы рассматриваете использование "специфичного для столбца" ключа для использования с "AES_ENCRYPT" и "AES_DECRYPT". Как сказал комментатор, это плохая идея, потому что любое вторжение будет иметь доступ ко всем данным.

Если вы используете "пользовательский" пароль, с/без соли, вы гораздо безопаснее.

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