Безопасное копирование и преобразование полей в новые поля без ГДЕ в MySql

0

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

UPDATE users SET name_enc= AES_ENCRYPT(name,'mykey'),  email_enc= AES_ENCRYPT(email,'mykey');

Меня беспокоит, что если я должен был сделать:

UPDATE users SET name='fred'

то каждая строка будет установлена в 'fred'

Является ли MySql самостоятельно разрабатывать строки, которые я хочу обновить, неявно в строке?

Я буду делать это только один раз, но я должен быть уверен, что все в порядке. (Очевидно, что это то, что он сохраняет выполнение циклов и отдельных строк UPDATES через PHP)

  • 0
    Если вы обновляете все записи, нет необходимости в WHERE . В противном случае WHERE является обязательным. Лучше попробовать одну запись с предложением WHERE и, если это нормально, продолжайте без WHERE
Теги:

1 ответ

1
Лучший ответ

Пусть это займет немного.

Я знаю, что не могу зашифровать текущие данные в себе,

На самом деле вы можете, если вы правильно подготовите столбцы.

поэтому я буду создавать новые поля. Пусть говорят "имя" и "name_enc", "email" и "email_enc".

Это вряд ли перенесет вас вперед, так как вы храните в таблице как простые, так и зашифрованные версии. Чтобы достичь своей конечной цели, то есть зашифрованных данных, вам все равно придется отбрасывать исходные столбцы и переименовывать созданные вами новые (плюс все связанные с этим изменения в приложении).

Мой тест показывает, что он работает с каждой строкой в таблице, если я не оставляю квалификацию WHERE, но это безопасная и надежная техника?

Да, это безопасно, если новые столбцы достаточно длинны, чтобы хранить вновь зашифрованные значения. Целевые столбцы должны быть типа VARBINARY, а длина столбца должна быть рассчитана с помощью

16 * (FLOOR(current_field_length / 16) + 1).

Пользователи UPDATE SET name_enc = AES_ENCRYPT (имя, 'mykey'), email_enc = AES_ENCRYPT (электронная почта, 'mykey');

Это будет работать нормально.

Меня беспокоит, что если я должен был сделать:

Пользователи UPDATE SET name = 'fred'

то каждая строка будет установлена в 'fred'

Ты прав. Это будет сделано, потому что, в отличие от вашего другого примера, вы не используете имя столбца в правой части задания. Другим примером может быть что-то вроде

UPDATE users SET age = 1;

Что сделало бы всех 1 год. Сравнить с

UPDATE users SET age = age + 1;

Что сделало бы всех на год старше.

Является ли MySql самостоятельно разрабатывать строки, которые я хочу обновить, неявно в строке?

Да.

  • 0
    Да, я знаю все это по столбцам шифрования - я просто хотел подтвердить соответствие MySql строкам - спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню