数据库管理:SQL Server 2008安全性探讨
Ruby 发表于:12年09月06日 11:18 [转载] DOIT.com.cn
SQL Server加密
关于SQL Server 2008使用的加密层级结构,顶层是Windows层,其中包括Windows Data Protection API (DPAPI)。DPAPI负责使用本地机器密钥加密服务的服务主密钥。服务主密钥是SQL环境中加密链的顶层。首次创建低级别的密钥时,系统会自动生成服务主密钥。
服务主密钥的下面是数据库主密钥Database Master Key。数据库主密钥可以保护数据库中所有证书的私钥和非对称密钥的私钥。它是采用3DES加密算法和密码加密的对称密钥。该密钥的副本使用服务主密钥加密,并存储在主数据库和应用它的数据库中。如果数据库被转移到另一个服务器上,可以使用OPEN MASTER KEY语句并提供加密密码来解密数据库主密钥。
在数据库作用域中,还有可用于加密数据库的对称密钥和非对称密钥,以及可以用于数字签名和实现不可否认性的证书。
应该首先创建数据库主密钥,记住数据库主密钥是对称密钥,用来加密数据库中的所有私有密钥数据。如果使用非对称密钥或证书,这是非常有用的,因为创建它们时不需要提供密码或其它保护与双方关联的私钥的机制。要为AdventureWorks2008数据库创建一个新的主密钥,可以执行下面的命令:
创建主密钥需要数据库的CONTROL权限,如果已经创建了一个主密钥,那么要想创建新的主密钥,必须删除现有的主密钥。如果现有的主密钥已被用来加密数据库中的一个私钥,那么就不能删除它了。一旦创建了主密钥,就可以查询sys.database目录视图,通过 is_master_key_encrypted_by_server列查看该数据库主密钥是否已经使用服务主密钥加密。该列使用一个布尔值表明数据库主密钥是否使用服务主密钥加密。如果数据库主密钥是在另一个服务器上创建的,该值就为0
- SELECT NAME, [is_master_key_encrypted_by_server] FROM sys.databases
在继续讨论使用其他密钥之前,让我们看一下如何备份服务主密钥和数据库主密钥。如果必须进行灾难恢复,且需要恢复使用这些密钥之一加密的数据,那么这将是相当有用的。梁宗密钥的语法是相似的,但需要额外的一部来备份加密的数据库主密钥。
首先看服务主密钥,在BACKUP SERVICE MASTER KEY语句中使用一个文件路径,可以是一个本地或UNC路径,以及一个满足密码复杂度要求的密码,备份文件时使用密码可以防止他人将您的主密钥还原到另一台服务器上,然后解密您的数据库主密钥
- BACKUP SERVICE MASTER KEY TO FILE='C:\KyeBackups\ServiceMasterKey' ENCRYPTION BY PASSWORD='c@MplexP@ssw0rd'; --如果需要还原该服务主密钥,可使用
- RESTORE SERVICE MASTER KEY FROM FILE='C:\KyeBackups\ServiceMasterKey' DECRYPTION BY PASSWORD='c@MplexP@ss0rd';
备份和还原数据库主密钥的方法如下:
- --Backup the database master key
- USE AdventureWorks2008; OPEN MASTER KEY DECRYPTION BY PASSWORD='P@ssw0rd'
- BACKUP MASTER KEY TO FILE='C:\KyeBackups\AWorksMasterKey' ENCRYPTION BY PASSWORD='dn9e8h93ndwjKJD'; GO
- --Restore the database master key
- USE AdventureWorks2008; RESTORE MASTER KEY FROM FILE='C:\KyeBackups\ServiceMasterKey'
- DECRYPTION BY PASSWORD='dn9e8h93ndwjKJD' ENCRYPTION BY PASSWORD='P@ss0rd'
- GO