Intereting Posts
Laravel: Где выбор для Eloquent Eager Загрузка отношений Как поместить транзакцию begin-commit в контроллер: cakephp? Переменные Mysql, не работающие через запрос php mysql Реализация Shunting Yard в PHP необходима, интерпретирует и анализирует строку, выполняет математическое сравнение и возвращает логический результат PHP для поиска внутри 30 000 текстовых файлов Показать все строки в таблице mysql, а затем дать возможность удалить определенные Как получить данные с помощью> = И <= в 12-часовой формат времени в php / mysql? сортировать многомерный ассоциативный массив? Как удалить таблицу MSSQL Datetime GETDATE () Столбцы, если они являются старыми или старыми с использованием PHP показать div на форме submit без перенаправления Вставить несколько значений флажка с использованием значения текстового поля в базе данных ImageMagick / Imagick конвертирует PDF в JPG с использованием собственного PHP API моя таксономия – $ taxonomy.php page post not show? Попытка получить потоковые / вложенные комментарии в PHP Проблема перенаправления PHP-страницы – Невозможно изменить информацию заголовка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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