Я планирую использовать MySQL и встроенные функции шифрования для шифрования / дешифрования определенных столбцов в определенных таблицах. Меня беспокоит то, что мне нужно где-то хранить ключ. Я мог бы, конечно, сохранить ключ в файле и управлять разрешениями этого файла и разрешениями приложения, которое обращается к нему, но этого достаточно? Я мог бы также создать веб-сервис, чтобы получить ключ или что-то еще.
Я в небольшом магазине, где я был бы единственным (возможно, другим человеком), у которого был бы доступ к машине, на которой было установлено приложение. Редактировать: я должен добавить, что есть веб-часть, часть которой требуется расшифровать данные, если я не добавил уровень.
Я выглядел ad nauseum, но никто, кажется, не получил пуленепробиваемого ответа.
Это одна из тех проблем, когда вам нужно довольствоваться достаточно хорошим? Учитывая, что я использую MySQL и PHP (возможно, Python), есть ли лучший способ приблизиться к этому?
Я не уверен, что использование MySQL для шифрования будет лучшим решением вашей проблемы.
Пакет PHP M_CRYPT считается неплохим, и он дает вам гибкость в выборе алгоритма, который лучше всего подходит для ваших нужд.
Сохранение вашего ключа на каком-то другом сервере имеет одно большое преимущество: ключ не находится на том же компьютере, что и зашифрованные данные *) . Таким образом, пока злоумышленник не имеет достаточного контроля над уязвимой машиной, они не могут добраться до ключа.
Если атакующий получает полный контроль над машиной, данные хранятся, они, скорее всего, смогут запросить веб-сервис для ключа.
Однако передача ключа с одной машины на другую открывает всю новую область, которая должна быть защищена. Вероятно, задействованы более ключевые и более уровни шифрования, тем самым увеличивая вероятность ошибок.
*) Другой вариант – ввести пароль при запуске веб-сервера и сохранить его только в памяти.
Возможное решение
Если рассматривается решение, использующее следующий метод шифрования файлов для пользователей с веб-доступом (я не уверен в вашей среде, но это может быть полезно):
Преимущества такого подхода:
1. Случайный ключ зашифровывается в базе данных. Таким образом, у вас все еще есть дополнительная безопасность сервера базы данных в сочетании с зашифрованным столбцом. 2. Документы хранятся с разными ключами, если злоумышленник получает ключ, только часть документов скомпрометирована.
Однако:
Если злоумышленник получает главный пароль и имеет доступ к доступу к таблице пользователя, вся система еще раз нарушена.
Я бы, вероятно, сохранил его в файле, который находится в каталоге, не доступном в Интернете, и как можно больше заблокирован с разрешениями файловой системы.
Ваш скрипт, связанный с сайтом, не должен открывать файлы файловой системы, используя переменные, особенно пользовательские. Даже не дайте им возможность проскользнуть что-то, прошедшее через ваш входной фильтр (вы правильно фильтруете данные, предоставленные пользователем?) И, возможно, отказались от содержимого ключевого файла. Храните пути к жестко запрограммированным строкам и определяйте () только. Поскольку большинство ваших данных хранится в MySQL, это не должно быть проблемой.
При выполнении дешифрования прочитайте ключ в чистой инициализированной переменной, выполните дешифрование, затем перезапишите ключевую переменную (скажем, с помощью строки x) и отмените переменную. Это, вероятно, все звучит немного параноидально, но если вы минимизируете время, когда ключ находится в ясной памяти и изолировать его от всех других переменных, работающих вокруг вашего PHP-скрипта, он не может сделать вас менее безопасным.
Если вы и еще один человек являются единственными, у которых есть физический доступ к машине, это, вероятно, просто отлично. Если кто-то ломается и крадет коробку, ну, у них есть все ваши данные, так что игра закончилась.
Кажется, что вы рассматриваете использование «специфичного для столбца» ключа для использования с «AES_ENCRYPT» и «AES_DECRYPT». Как сказал комментатор, это плохая идея, потому что любое вторжение будет иметь доступ ко всем данным.
Если вы используете «пользовательский» пароль, с солью или без нее, вы гораздо безопаснее.
Тем не менее, если ключ шифрования доступен только для чтения при использовании приложения, вы, вероятно, «достаточно хороши». Если машина разбита, они будут быстрее получать ваши данные с помощью одного ключа.