Каков наилучший способ шифрования данных без использования ресурса сервера 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.

Другие вопросы по тегам