MySQL - Работа с зашифрованными столбцами - PullRequest
2 голосов
/ 13 февраля 2012

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

1 Ответ

0 голосов
/ 04 июля 2012

Трудно ответить на ваш вопрос, не зная, какой тип шифрования вы используете. Если это стандартное шифрование / хеширование, такое как MD5, вы можете использовать его непосредственно в MySQL с предложением типа WHERE ssn=MD5('ssnStr'), хотя MD5 не предназначен для дешифрования. В противном случае, если это какое-то настраиваемое шифрование, вам придется либо

1) создайте процедуру, которая выполняет шифрование / дешифрование, и используйте ее в предложении WHERE

или

2) выполнить шифрование заранее и использовать его результат для соответствия условию, которое вы хотите в предложении WHERE или где-либо в вашем запросе.

Лучше всего предоставить вашему запросу зашифрованное значение для SSN и использовать его для соответствия вашему полю. Если вам нужно выполнить какое-то дешифрование для каждой строки в вашей БД, это не будет эффективным вообще. Другими словами, предоставьте свой запрос с вводом, который непосредственно соответствует данным, сохраненным для лучшей производительности.

...