加密通常通过控制加密层次结构来控制,而不是(仅)通过访问控制。换句话说,用户可以通过知道解密/加密密钥(具体来说就是保护密钥的密码)对数据进行加密和解密。所有好的加密方案都使用密钥层次结构。一个典型的简单层次结构是
- 数据使用对称密钥加密
- 对称密钥使用证书加密
- 与证书关联的私钥使用密码加密
- 授权用户提供私钥解密密码以访问数据
您还可以在使用的证书上添加显式授予/拒绝/撤销权限,请参阅GRANT Certificates Permissions但这不能替代知道证书加密密码密码。现在回到你的问题:
如何仅限制一个帐户使用对称密钥访问加密/解密的能力
该能力应该应用于加密对称密钥的证书,而不是对称密钥本身。使用这种间接级别,您可以为每个有权访问数据的用户创建一个证书,并让每个用户只知道自己的访问密码。撤销访问权限就像删除该特定用户的证书一样简单,不会影响任何其他用户的访问权限。添加新用户意味着添加新证书并将新证书的加密添加到加密数据的对称密钥中,从而实际上授予对数据的访问权限。由于社会原因,用户共享访问密码的替代方案在实践中从未奏效。
我可以使用触发器来更新需要加密的列,因为它正在使用上面的帐户和 SYMMETRIC KEY 插入
理想情况下,应用层应该调用一个存储过程来操作数据,在插入之前显式加密数据。您可以使用INSTEAD OF 触发器推出穷人的“透明”解决方案。计算列可以公开解密数据,它将向所有未正确打开解密证书的用户(会话)显示 NULL。
钥匙必须旋转和改变
您轮换加密对称密钥的证书,而不是对称密钥本身。对称密钥也应该定期更改,但不要轮换,只需添加一个新的对称密钥并开始将其用于新数据和旧数据的更新,以限制暴力破解的范围并降低生日攻击的概率。理由是重新加密静态数据通常非常昂贵。大多数加密方案在加密层次结构(即上面提到的证书)中旋转更高的密钥,而不是用于加密数据的实际对称密钥。