MySQL - 使用加密列

时间:2012-02-13 18:48:50

标签: mysql encryption triggers views

我有一些加密字段的表格。查看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 :(得分:0)

在不知道您正在使用的加密类型的情况下回答您的问题是很困难的。它是标准的加密/散列,例如MD5,您可以在MySQL中使用WHERE ssn=MD5('ssnStr')类型的子句直接使用它,因为MD5不用于解密。否则,如果是某种自定义加密,则必须

1)创建一个执行加密/解密的过程,并在WHERE子句中使用它

2)事先执行加密并使用其结果来匹配WHERE子句中所需的条件或查询中的任何位置。

最好为您的查询提供SSN的加密值,并使用该值来匹配您的字段。如果必须对数据库中的每一行执行某种解密,则根本不会有效。换句话说,为您的查询提供与输入数据直接匹配的输入,以获得最佳性能。