代码之家  ›  专栏  ›  技术社区  ›  gotqn user3521065

用于确定性加密的T-SQL/CLR函数

  •  1
  • gotqn user3521065  · 技术社区  · 7 年前

    我有一个包含用户代理字符串的表,其结构如下:

    UserAgentStringID INT
    UserAgentStringValue VARBINARY(8000)
    

    这个 [UserAgentStringValue] 字段使用对称密钥加密。以前版本的表结构是:

    UserAgentStringID INT
    UserAgentStringValue NVARCHAR(4000)
    UserAgentStringHASH BINARY(32)
    

    我在 [UserAgentStringHASH] 列以优化搜索者。

    对于新格式,这种索引的效率不如 ENCRYPTION 函数使用 InitializationVector 为了在每次使用相同的输入调用加密函数时生成随机值:

    初始化向量用于初始化块算法。它 不是为了保密,但对于每个调用都必须是唯一的 加密功能,以避免泄露模式。

    所以,我可以在加密字段上创建索引,但如果我尝试按加密值搜索,我将无法找到任何内容。

    我不想使用 HASH 因为使用哈希函数不是安全的技术。如果有人拥有我的表数据和包含所有或大量用户代理的表,他/她将能够通过哈希执行连接并显示我的数据。

    在里面 SQL Server 2016 SP 我们有标准版 Always Encrypted 允许使用 Deterministic Encryption 对于列值-这意味着正在进行相等的比较,并且可以创建索引。

    我正在寻找一种通过其他技术优化搜索的方法,或者一种使用CLR实现确定性加密的方法,例如?

    知道周围没有工作对我来说也没问题。我想我会用性能来支付数据保护的费用。

    1 回复  |  直到 7 年前
        1
  •  0
  •   gotqn user3521065    5 年前

    我正在发布一个解决方案-这不是理想的解决方案,但它是速度和安全性之间的折衷。

    详细信息

    • 列必须加密(比如电子邮件地址)
    • 必须实现快速搜索(假设电子邮件用于登录,我们需要尽快找到记录)
    • 我们无法使用始终加密的确定性加密(由于各种原因)
    • 我们不想将哈希函数与salt一起使用-如果每个用户都有salt,ze可能能够使用大样本数据库读取哈希

    安全层次结构

    有多种实现安全层次结构的方法。MSDN中的以下模式对其进行了很好的描述。

    enter image description here

    在我们的环境中,我们使用数据库主键->证书->对称密钥层次结构。仅DBA know DMK密码,可以访问证书和对称密钥。一些开发人员可以加密/解密数据(使用普通的T-SQL),而其他开发人员则不能。

    注意,使用Always Encrypted可以进行角色分离—处理数据的人员无权访问密钥,而有权访问密钥的人员无权访问数据。在我们的情况下,我们希望保护我们的数据不受外来者的影响,并使用其他技术在内部授予/记录数据访问权限。

    可以访问加密数据的开发人员

    能够访问受保护数据的开发人员能够对其进行加密和解密。它们无法访问对称键值。如果可以访问对称键值,则ze可以 decrypt 没有用于保护对称密钥的证书的数据事件。基本上,只有系统。管理员和db\U所有者可以访问对称密钥值。

    如何散列

    我们需要一个哈希来快速搜索,但我们不能使用未加密的salt。从安全角度来看,无盐哈希就像纯文本一样。因此,我们决定使用对称键值作为salt。是这样的:

    SELECT @SymmetricKeyValue = CONVERT(VARCHAR(128), DECRYPTBYCERT(C.[certificate_id], KE.[crypt_property]), 1)
    FROM [sys].[symmetric_keys] SK
    INNER JOIN [sys].[key_encryptions] KE
        ON SK.[symmetric_key_id] = KE.[key_id] 
    INNER JOIN [sys].[certificates] C
        ON KE.[thumbprint] = C.[thumbprint]
    WHERE SK.[name] = @SymmetricKeyName;
    

    然后将该值连接到您的电子邮件地址,然后计算哈希值。这对我们有好处,因为我们正在将哈希绑定到安全层次结构。对于每个记录,它不是不同的salt,而是相同的-但是如果知道对称密钥值,ze可以直接解密数据。

    注意事项

    您需要创建例程(存储过程、触发器),这些例程通过哈希值进行搜索或使用 EXECUTE AS OWNER 条款否则,开发人员将无法仅作为sys执行它们。管理员和db\U所有者可以访问对称密钥值。