? 使用透明数据库加密的理由:
• 整个数据库都进行了加密
• 应用程序不受到加密和解密的影响
– 索引和数据类型不受到影响(除了FileStream)
– 不需要调用任何加密和解密函数
• 性能影响相当小
• 没有密钥不能使用备份
? 透明数据加密的应用场景,如下图4所示
图4透明数据加密的应用场景
4. 代码模块签名
在SQL Server 2008 R2中提供加密的另外一个好处就是提供了证书可以对代码模块(函数、存储过程、事件通知和触发器)进行数字签名的能力,这样对于数据库表和其他对象访问的粒度控制就能做到更细,如果经过签名的代码模块只能通过代码访问特定的表数据,则经过恶意修改的代码模块由于未经过签名,则不能进行未授权的操作。签名代码模块还能防止对代码模块做出未经授权的更改,和其他进过数字签名的文档一样,在代码改变时,证书将会失效,代码不在证书上下文中执行时,任何被提供了证书访问权限的对象都将不可访问。若要继续访问,则需要创建一个证书,将该证书与新用户关联并使用该证书签名代码块,授予该用户执行该代码块必要的任何权限。事实上这样做已经将该用户作为次级身份标识添加到了代码块安全上下文中,最后授予要执行该代码块的用户和角色执行权限。下列代码展示了以上的步骤,假设用户想要签名mySchema.GetSecretStuffs过程,并且所有引用的对象已经存在与数据库中:
CREATE CERTIFICATE certCodeSigning
ENCRYPTION BY PASSWORD = 'Pass%DwrO4!JaXfLxnC'
WITH SUBJECT = 'Code signing certificate'
GO
-- Sign the stored procedure
ADD SIGNATURE TO mySchema.GetSecretStuffs BY CERTIFICATE certCodeSigning
WITH PASSWORD = 'Pass%DwrO4!JaXfLxnC'
GO
-- Map a user to the certificate
CREATE USER certUser FOR CERTIFICATE certCodeSigning
GO
--Assign SELECT permissions to new certUser
GRANT SELECT ON SocialSecurity TO certUser
GO
-- Grant execute permission to the user who will run the code
GRANT EXECUTE ON mySchema.GetSecretStuffs TO ProcedureUser
GO
ENCRYPTION BY PASSWORD = 'Pass%DwrO4!JaXfLxnC'
WITH SUBJECT = 'Code signing certificate'
GO
-- Sign the stored procedure
ADD SIGNATURE TO mySchema.GetSecretStuffs BY CERTIFICATE certCodeSigning
WITH PASSWORD = 'Pass%DwrO4!JaXfLxnC'
GO
-- Map a user to the certificate
CREATE USER certUser FOR CERTIFICATE certCodeSigning
GO
--Assign SELECT permissions to new certUser
GRANT SELECT ON SocialSecurity TO certUser
GO
-- Grant execute permission to the user who will run the code
GRANT EXECUTE ON mySchema.GetSecretStuffs TO ProcedureUser
GO