【问题标题】:MySQL - Working with Encrypted ColumnsMySQL - 使用加密列
【发布时间】:2012-02-13 18:48:50
【问题描述】:

我有一些带有加密字段的表。在查看 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 承担繁重的加密和解密工作,以便尽可能轻松地与开发人员合作。我希望应用程序开发人员在仍然使用加密字段的同时尽可能不必担心加密字段,这是这里的最终目标。感谢您提供任何帮助或建议。

【问题讨论】:

    标签: mysql encryption triggers views


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多