【赚】使用数据库加密保护敏感数据

http://bbs.mscommunity.com/forums/ShowThread.aspx?PostID=42016

1.       在SQL Server 2005中,数据库的主密钥可以直接用来加密保护:(AB)


A.       证书的私钥


B.       非对称密钥的私钥


C.      非对称密钥的公钥


D.      服务主密钥



2.       当采用加密技术来保护数据库中的大量敏感数据时,为了兼顾性能和数据的安全性,最佳的做法是:(C)


A.       使用证书加密所有敏感数据,并用对称密钥加密保护证书的私钥


B.       使用非对称密钥的公钥加密所有敏感数据,并用对称密钥加密保护该密钥对的私钥


C.      使用对称密钥加密所有敏感数据,并用证书加密保护该对称密钥


D.      使用非对称密钥的私钥加密所有敏感数据,并用证书加密保护该密钥对的公钥



3.       SQL Server 2005中使用证书签署存储过程的目的是:(D)


A.       确保只有拥有该证书对应私钥的用户才能执行该存储过程


B.       加密存储过程,防止其它人查看到存储过程中的T-SQL语句


C.      加密存储过程执行返回的数据结果集


D.      让该存储过程以证书所对应的数据库用户的权限执行


/*
[课程]使用数据库加密保护敏感数据

DEMO 1
了解SQL2005加密层次结构


[过程]
过程一共分为4个部分

*/

--==================(I)服务主密钥=====================
--
1.)备份服务主密钥到文件
BACKUP SERVICE MASTER KEY TO FILE = 'C:\DBFile\SMK.bak'
ENCRYPTION
BY PASSWORD = 'P@ssw0rd'

--2.)生成新的服务主密钥
ALTER SERVICE MASTER KEY REGENERATE;
GO

--3.)从备份文件还原服务主密钥
RESTORE SERVICE MASTER KEY FROM FILE = 'C:\DBFile\SMK.bak'
DECRYPTION
BY PASSWORD = 'P@ssw0rd'


--==================(II)数据库主密钥=====================
--
1.)为Northwind数据库创建数据库主密钥
USE Northwind
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd'
GO

--2.)查看数据库加密状态
SELECT [name], is_master_key_encrypted_by_server
   
FROM sys.databases WHERE name = 'Northwind';
GO

--3.)查看数据库主密钥的信息
USE Northwind
SELECT * FROM sys.symmetric_keys
GO

--4.)对数据库主密钥进行备份
USE Northwind
GO
BACKUP MASTER KEY
   
TO FILE = 'C:\DBFile\DMK.bak'
    ENCRYPTION
BY PASSWORD = 'P@ssw0rd!@'
GO

--5.)删除服务主密钥对数据库主密钥的保护
--
     创建非对称密钥成功,自动使用服务主密钥解密并使用该数据库主密钥
CREATE ASYMMETRIC KEY asy_TestKey1 WITH ALGORITHM = RSA_1024
GO
--     删除服务主密钥对数据库主密钥的保护
ALTER MASTER KEY
   
DROP ENCRYPTION BY SERVICE MASTER KEY
GO
--      查看数据库的加密状态
SELECT [name], is_master_key_encrypted_by_server
   
FROM sys.databases WHERE name = 'Northwind';

--     创建非对称密钥失败,数据库主密钥未打开
CREATE ASYMMETRIC KEY asy_TestKey2 WITH ALGORITHM = RSA_1024
GO

--     打开数据库主密钥未
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'P@ssw0rd'
SELECT * FROM sys.openkeys

--     创建非对称密钥成功
CREATE ASYMMETRIC KEY asy_TestKey2 WITH ALGORITHM = RSA_1024
GO

--     恢复服务主密钥对数据库主密钥的保护
ALTER MASTER KEY
   
ADD ENCRYPTION BY SERVICE MASTER KEY
CLOSE MASTER KEY

--==================(III)证书=====================
--
1.)让SQL2005创建自签名的证书
USE Northwind
GO
CREATE CERTIFICATE cert_TestCert1
    ENCRYPTION
BY PASSWORD = 'P@ssw0rd'
   
WITH SUBJECT = 'TestCert1',
    START_DATE
= '1/31/2006',
    EXPIRY_DATE
= '1/31/2008'
GO

SELECT * FROM sys.certificates

--2.)从文件导入证书
USE Northwind
GO
CREATE CERTIFICATE cert_TestCert2
   
FROM FILE = 'C:\DBFile\MSCert.cer'
GO

SELECT * FROM sys.certificates

--3.)备份导出证书和私钥
BACKUP CERTIFICATE cert_TestCert1
   
TO FILE = 'c:\DBFile\TestCert1.cer'
   
WITH PRIVATE KEY
        (DECRYPTION
BY PASSWORD = 'P@ssw0rd' ,
        
FILE = 'c:\DBFile\TestCert1_pvt' ,
         ENCRYPTION
BY PASSWORD = 'Pa$$w0rd')

--4.)使用证书加密、解密数据
DECLARE @cleartext varbinary(200)
DECLARE @cipher varbinary(200)
SET @cleartext = CONVERT(varbinary(200), 'Test text string')
SET @cipher = EncryptByCert(Cert_ID('cert_TestCert1'), @cleartext)
SELECT @cipher

SELECT CONVERT(varchar(200), DecryptByCert(Cert_ID('cert_TestCert1'), @cipher, N'P@ssw0rd')) AS [ClearText]

--5.)删除证书私钥
ALTER CERTIFICATE cert_TestCert1
    REMOVE PRIVATE
KEY
Go
--    加密成功,解密失败
DECLARE @cleartext varbinary(200)
DECLARE @cipher varbinary(200)
SET @cleartext = CONVERT(varbinary(200), 'Test text string')
SET @cipher = EncryptByCert(Cert_ID('cert_TestCert1'), @cleartext)
SELECT @cipher
SELECT CONVERT(varchar(200), DecryptByCert(Cert_ID('cert_TestCert1'), @cipher, N'P@ssw0rd')) AS [ClearText]


--==================(IV)非对称密钥=====================
--
1.)使用sn.ext生成非对成密钥文件
--
     sn -k C:\DBFile\asy_Test.key

--2.)从文件创建非对称密钥
USE Northwind
GO
CREATE ASYMMETRIC KEY asy_Test 
   
FROM FILE = 'C:\DBFile\asy_Test.key' 
    ENCRYPTION
BY PASSWORD = 'P@ssw0rd'
GO

SELECT * FROM sys.asymmetric_keys



/*
[课程]使用数据库加密保护敏感数据

DEMO 2
使用密钥对列数据进行加密


[过程]
过程一共分为4个部分

*/


--==================(I)准备=====================
--
1.)创建示例表
USE Northwind
IF EXIST dbo.EmpSalary DROP TABLE dbo.EmpSalary;

CREATE TABLE dbo.EmpSalary(
    EmpID
int,
    Title
nvarchar(50),
    Salary
varbinary(500)
)
GO

--2.)创建数据库主密钥
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd'
GO

--3.)


--4.)创建用于加密的对称密钥
CREATE SYMMETRIC KEY sym_Salary
   
WITH ALGORITHM = AES_192
    ENCRYPTION
BY PASSWORD = 'P@ssw0rd';

SELECT * FROM sys.symmetric_keys WHERE [name] = 'sym_Salary'


--==================(II)加密列数据=====================

--1.)打开对称密钥
OPEN SYMMETRIC KEY sym_Salary
    DECRYPTION
BY PASSWORD = 'P@ssw0rd'

SELECT * FROM sys.openkeys        --查看打开的对称密钥

--2.)向表中插入数据,并对Salary列的数据进行加密
INSERT INTO EmpSalary VALUES (1, 'CEO', EncryptByKey(KEY_GUID('sym_Salary'), '20000'))
INSERT INTO EmpSalary VALUES (2, 'Manager', EncryptByKey(KEY_GUID('sym_Salary'), '10000'))
INSERT INTO EmpSalary VALUES (3, 'DB Admin', EncryptByKey(KEY_GUID('sym_Salary'), '5000'))

--3.)关闭打开的对称密钥
CLOSE SYMMETRIC KEY sym_Salary

SELECT * FROM sys.openkeys        --查看打开的对称密钥

--4.)查看表中存放的数据
SELECT * FROM EmpSalary           



--==================(III)解密并访问被加密了的数据列=====================
--
1.)打开对称密钥
OPEN SYMMETRIC KEY sym_Salary DECRYPTION BY PASSWORD = 'P@ssw0rd'

--2.)使用对称密钥解密并访问被加密了的数据列
SELECT EmpID, Title, CAST(DecryptBykey(Salary) AS VARCHAR(20)) AS Salary FROM EmpSalary

--3.)关闭对称密钥
CLOSE SYMMETRIC KEY sym_Salary


--==================(III)绕过加密数据的攻击=====================
--
1.)攻击者使用其它数据行的加密数据替换某一行的数据
SELECT * FROM EmpSalary
UPDATE EmpSalary SET Salary =
    (
SELECT Salary FROM EmpSalary WHERE EmpID = 1)
   
WHERE EmpID = 3

--2.)查看被攻击后解密的数据
OPEN SYMMETRIC KEY sym_Salary DECRYPTION BY PASSWORD = 'P@ssw0rd'
SELECT EmpID, Title, CAST(DecryptBykey(Salary) AS VARCHAR(20)) AS Salary FROM EmpSalary
CLOSE SYMMETRIC KEY sym_Salary


--==================(IV)使用验证器防止绕过加密数据的攻击=====================
--
1.)删除前面添加的数据行
DELETE FROM EmpSalary

--2.)向表中插入数据,并对Salary列的数据使用验证器进行加密
OPEN SYMMETRIC KEY sym_Salary DECRYPTION BY PASSWORD = 'P@ssw0rd'
INSERT INTO EmpSalary VALUES (1, 'CEO', EncryptByKey(KEY_GUID('sym_Salary'), '20000', 1, '1'))
INSERT INTO EmpSalary VALUES (2, 'Manager', EncryptByKey(KEY_GUID('sym_Salary'), '10000', 1, '2'))
INSERT INTO EmpSalary VALUES (3, 'DB Admin', EncryptByKey(KEY_GUID('sym_Salary'), '5000', 1, '3'))
CLOSE SYMMETRIC KEY sym_Salary

--3.)解密并访问被加密了的数据列
OPEN SYMMETRIC KEY sym_Salary DECRYPTION BY PASSWORD = 'P@ssw0rd'
SELECT EmpID, Title, CAST(DecryptBykey(Salary, 1, CAST(EmpID AS VARCHAR(3))) AS VARCHAR(20)) AS Salary FROM EmpSalary
CLOSE SYMMETRIC KEY sym_Salary


--4.)攻击者使用相同的方法篡改数据
SELECT * FROM EmpSalary
UPDATE EmpSalary SET Salary =
    (
SELECT Salary FROM EmpSalary WHERE EmpID = 1)
   
WHERE EmpID = 3

--5.)被篡改后的加密了的数据列变成无效
OPEN SYMMETRIC KEY sym_Salary DECRYPTION BY PASSWORD = 'P@ssw0rd'
SELECT EmpID, Title, CAST(DecryptBykey(Salary, 1, CAST(EmpID AS VARCHAR(3))) AS VARCHAR(20)) AS Salary FROM EmpSalary
CLOSE SYMMETRIC KEY sym_Salary





/*
[课程]使用数据库加密保护敏感数据

DEMO 3
使用证书签署存储过程


[过程]
过程一共分为2个部分

*/

--==================(I)示例准备=====================
--
1.)创建数据库主密钥
USE Northwind
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd'

--2.)创建签署存储过程所需要的证书
CREATE CERTIFICATE cert_Products
   
WITH SUBJECT = 'Products Sign',
    START_DATE
= '2006/1/1',
    EXPIRY_DATE
= '2008/1/1'

--3.)创建SPDeveloper登录帐户和用户,该用户创建访问Products表的存储过程
CREATE LOGIN [SPDeveloper] WITH PASSWORD=N'P@ssw0rd', DEFAULT_DATABASE=[Northwind]
GO
CREATE USER [SPDeveloper] FOR LOGIN SPDeveloper WITH DEFAULT_SCHEMA=[SPDeveloper]
GO
CREATE SCHEMA products AUTHORIZATION SPDeveloper
GO
EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'SPDeveloper'

--4.)以SPDeveloper的身份创建存储过程products.usp_Products
EXECUTE AS USER = 'SPDeveloper'
GO
CREATE PROCEDURE products.usp_Products
AS
   
SELECT TOP 5 * FROM dbo.Products
GO

REVERT
SELECT USER

--4.)创建普通用户Jerry
CREATE LOGIN jerry WITH PASSWORD=N'P@ssw0rd', DEFAULT_DATABASE=[Northwind]
CREATE USER jerry FOR LOGIN jerry


--==================(II)使用证书签署存储过程=====================
--
1.)授予用户Jerry执行存储过程的权限
GRANT EXECUTE ON products.usp_Products TO jerry

--2.)以Jerry的身份执行存储过程失败,因为拥有全链是断裂的
EXECUTE AS USER = 'jerry'
SELECT USER
GO

EXECUTE products.usp_Products
GO

REVERT

--3.)使用证书在当前数据库创建用户ProductsReader,
--
     并为该用户赋予读取Products表的权限
CREATE USER ProductsReader FOR CERTIFICATE cert_Products
GO
GRANT SELECT ON Products TO ProductsReader

--4.)使用证书签署当前存储过程
ADD SIGNATURE TO products.usp_Products BY CERTIFICATE cert_Products

--4.)以Jerry的身份重新执行存储过程,成功,
--
     因为存储过程将以ProductsReader的权限上下文执行
EXECUTE AS USER = 'jerry'
SELECT  USER
GO
EXECUTE products.usp_Products






问题:如果没有使用密钥,会出现什么样的安全问题呢?
回答:只有在数据库中有需要保护的敏感数据时,才使用数据库加密,所以如果在数据库中没有这样的数据信息,那么也就可以不启用数据库加密,也就不用创建相应的密钥了。

问题:当使用OPEN SYMMETRIC KEY打开多个对称密钥时,用函数DecryptByKey解密时SQL 2005会使用那个密钥呢?
回答:使用对称密钥加密的密文起始位置表明了生成该密文对称密钥的GUID,所以它会自动根据密钥的GUID来选择相应的密钥进行解密。

问题:如何备份对称密钥和非对称密钥?
回答:对称密钥和非对称密钥是数据库级别的对象,虽然没有提供直接备份它们的机制,但是可以通过对数据库备份来实现对密钥的备份。另外在生成对称密钥时可以使用密码短语来生成密钥,这样保存了密码短语就备份了相应的对称密钥。对于非对称密钥可以使用有强名称文件来生成密钥对,只要保存了该文件也就备份了相应的非对称密钥。

 
 

转载于:https://www.cnblogs.com/rock_chen/archive/2007/09/30/911750.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值