Мне нужно зашифровать некоторые поля. Я знаю, что не могу зашифровать текущие данные в себе, поэтому я буду создавать новые поля. Пусть говорят "имя" и "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)
Пусть это займет немного.
Я знаю, что не могу зашифровать текущие данные в себе,
На самом деле вы можете, если вы правильно подготовите столбцы.
поэтому я буду создавать новые поля. Пусть говорят "имя" и "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 самостоятельно разрабатывать строки, которые я хочу обновить, неявно в строке?
Да.
WHERE
. В противном случаеWHERE
является обязательным. Лучше попробовать одну запись с предложениемWHERE
и, если это нормально, продолжайте безWHERE