Каков наилучший способ шифрования данных без использования ресурса сервера MySQL? Является ли mcrypt с режимом CFB лучшим способом с php?
У меня огромная база данных с незашифрованными полями.
Эти данные являются конфиденциальными, и менеджеры приняли решение зашифровать их как можно скорее. И все новые данные должны быть автоматически зашифрованы таким же образом.
Первый метод:
Если я использую aes_encrypt
создать новое поле и вставить в него зашифрованные данные следующим образом:
INSERT INTO myTable(name_en, name_es, phone)
VALUES(aes_encrypt(name_en, :key), aes_encrypt(name_es, :key), aes_encrypt(phone, :key))
И после этого каждый запрос вставки должен использовать aes_encrypt()
Будь находчивым к серверу.
Второй метод:
использование libsodium
библиотека, которая является отличным решением для новых данных. Но существующие данные останутся такими же, как libsodium, который нельзя использовать внутри MySQL Query.
Третий метод:
Использование mcrypt_encrypt с MCRYPT_RIJNDAEL_128 в качестве эквивалента aes_encrypt
, а затем вставьте зашифрованную переменную в запрос, не позволяя MySQL выполнять часть шифрования, что уменьшит нагрузки и время обработки.
Но mcrypt_encrypt
больше не является безопасным, особенно с ECB
Режим.
Каков наилучший метод, чтобы зашифровать несколько полей в существующей базе данных MySQL и, конечно же, новую? А если бы я использовал mcrypt с режимом CFB, можно ли впоследствии использовать aes_decrypt для проверки данных?
0 ответов
Как лучше всего зашифровать несколько полей в существующей базе данных MySQL и, конечно же, в новой?
Напишите сценарий PHP, который читает вашу базу данных и шифрует на уровне приложения (т.е. в PHP), а не на уровне базы данных (т.е. не в SQL). Зашифруйте их все сразу, и пусть ваши сценарии гибко шифруют новые поля.
Но существующие данные останутся такими же, поскольку libsodium нельзя использовать в запросе MySQL.
Тот факт, что libsodium недоступен для MySQL, вовсе не должен быть препятствием. В конце концов, вы же не хотите, чтобы у вашей базы данных был шанс украсть ваши ключи. MySQL должен видеть только непрозрачные большие двоичные объекты зашифрованного текста.
Вы не должны пытаться зашифровать с помощью SQL-запроса. Сделайте это вне SQL и замените поля зашифрованным текстом. Затем, когда ваш процесс будет завершен, убедитесь, что у вас нигде нет кешированного открытого текста.
Предостережение
Если вы пытаетесь зашифровать всю базу данных, вы, вероятно, в конечном итоге захотите использовать некоторые поля в WHERE
пункт SELECT
запрос. Добро пожаловать в симметричное шифрование с возможностью поиска. Здесь много сумасшедших академических замыслов (шифрование с сохранением порядка, гомоморфное шифрование и т. Д.).
В этом случае я рекомендую CipherSweet. Это быстро, безопасно, проще рассуждать и не требует установки каких-либо сторонних расширений C для использования из PHP.