2012-02-13 2 views
2

У меня есть несколько таблиц с зашифрованными полями. Просмотрев документы MySQL, я обнаружил, что вы не можете создать собственный тип данных для шифрования/дешифрования, что было бы идеальным. Таким образом, вместо того, у меня есть вид, аналогичный приведенному ниже:MySQL - Работа с зашифрованными столбцами

CREATE VIEW EMPLOYEE AS 
SELECT ID, FIRST_NAME, LAST_NAME, SUPER_SECURE_DECRYPT(SSN) AS SSN 
FROM EMPLOYEE_ENCRYPTED 

Опять же, после прочтения документации MySQL, я узнал, что точка зрения не является вставной, поскольку он имеет производный столбец и номер социального страхования поле не обновляется, поскольку это производный столбец, что имеет смысл. Однако вы не можете добавить триггер в представление, поэтому запись в представление на самом деле не является вариантом.

В попытке обойти это, я создал пару триггеров похож на:

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 для обновления заявление, что запрашивает зашифрованный столбец (как в обновлении сотрудника по их ССН). Как правило, это не проблема, поскольку я обычно использую первичный ключ для обновлений, но мне нужно знать для других зашифрованных полей, если есть способ сделать это.

Я хочу сделать MySQL сделать тяжелый подъем для шифрования и дешифрования, чтобы он мог быть как можно более трением работать с разработчиком. Я хотел бы, чтобы разработчик приложений не должен был беспокоиться о зашифрованных полях как можно больше, все еще используя зашифрованные поля, это конечная цель здесь. Любая помощь или совет приветствуются.

ответ

0

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

1) создать процедуру, которая выполняет шифрование/дешифрование и использовать его в вашем ИНЕКЕ

или

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

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

Смежные вопросы