У меня есть несколько таблиц с зашифрованными полями. Посмотрев документы MySQL, я обнаружил, что вы не можете создать собственный тип данных для шифрования / дешифрования, который был бы идеальным. Итак, вместо этого у меня есть вид, аналогичный приведенному ниже:
CREATE VIEW EMPLOYEE AS
SELECT ID, FIRST_NAME, LAST_NAME, SUPER_SECURE_DECRYPT(SSN) AS SSN
FROM EMPLOYEE_ENCRYPTED
Опять же, прочитав документацию MySQL
, я узнал, что представление не может быть вставлено, потому что оно имеет производный столбец, а поле SSN не обновляется, поскольку это производный столбец, что имеет смысл. Однако вы не можете добавить триггер к представлению, так что запись в представление на самом деле не вариант.
В попытке обойти это, я создал пару триггеров, похожих на:
CREATE TRIGGER EMPLOYEE_ENCRYPTED_UPDATE
BEFORE UPDATE ON EMPLOYEE_ENCRYPTED FOR EACH ROW
BEGIN
IF NEW.SSN <> OLD.SSN THEN
SET NEW.SSN = SUPER_SECURE_ENCRYPT(NEW.SSN);
END IF;
END;
, а также один для вставки (который, поскольку он очень похож, я не собираюсь публиковать). Это просто означает, что я должен читать из представления и записывать в таблицу.
Это достойное решение , за исключением , когда вы предоставляете предложение where
для оператора обновления, который запрашивает зашифрованный столбец (например, обновляет сотрудника по его SSN). Как правило, это не проблема, поскольку я обычно использую первичный ключ для обновлений, но мне нужно знать о других зашифрованных полях, если есть способ сделать это.
Я хочу заставить MySQL
выполнять тяжелую работу по шифрованию и дешифрованию, чтобы работать с разработчиком было как можно проще. Я бы хотел, чтобы разработчик приложений не беспокоился о зашифрованных полях, насколько это возможно, при этом все еще используя зашифрованные поля, и это конечная цель. Любая помощь или совет приветствуется.