数据加密 第一篇:加密的分层结构
悦光阴 人气:1加密是通过使用密钥或密码来混淆数据的处理过程,把明文处理为密文,如果没有拿到相应的解密密钥或密码,即使拿到密文,也是无用,因此加密是保护数据的一个方法。用户只有拿到密钥和证书把密文数据解密之后,才能使用数据。如果没有密钥和证书,即使得到了数据,也无法得知数据的原始值,数据就没有价值了。由于数据的加密和解密是一种资源密集性(特别是CPU和I/O )的操作,同时加密后的数据量会增大,因此,往往会带来查询性能的下降,一般只会对敏感数据加密。
一,加密概念
对称密钥(Symmetric Keys)
虽然是“钥匙”,但是本质是加密数据的算法,并且是加密中最弱的算法,这是因为使用相同的算法来加密和解密数据。不过即使是最弱的算法,也能增加数据防御的能力,毕竟不是每个攻击者都是顶级的。对于对称密钥,可以使用密码,或者另一个密钥,甚至一个证书来加密。
非对称密钥(Asymmetric Keys)
跟对称密钥相对,它使用一对密钥(算法),一个密钥用于加密,另一个密钥用于解密,加密的密钥称为私钥(private key),解密的密钥称为公钥(public key)。跟对称密钥相比,非对称密钥提供的安全级别更高,也更消耗资源。
证书(Certificates)
公钥证书(Public Key Certificate)简称为证书,由受信任的源 (称为证书颁发机构 (CA)) 颁发。证书是一种数字签名的语句,使用的是非对称密钥,它将公钥的值绑定到拥有相应私钥的个人,设备或服务的ID上。证书由证书颁发机构(CA)颁发和签名。从CA接收证书的实体是该证书的主题(Subject),证书通常包含以下信息:
- 主题的公钥
- 主题的标识符信息
- 证书的有效期,证书仅在其中指定的时间段内有效
- 证书发行者的标识信息
- 发行人的数字签名
Windows 数据保护API(DPAPI,Windows Data Protection API)
是与 Windows 操作系统一起运行的加密应用程序编程接口 (API),可以使用用户安全信息或者域安全信息来加密密钥。DPAPI用于加密服务主密钥(service master key),服务主密钥在SQL Server中是高层加密
二,SQL Server加密概念
服务主密钥(Service Master Key,SMK)
服务主密钥是SQL Server加密层次结构的根。在SQL Server实例安装后,第一次启动时自动生成,用于加密数据库主密钥(DMK)、凭证(credentials)和链接服务器密码。通过使用Windows数据保护API(DPAPI)和本地主机的密钥来加密SMK,DPAPI通过使用从SQL Server服务帐户的Windows凭据和计算机的凭据派生的密钥来加密SMK。服务主密钥只能由创建它的服务帐户或有权访问计算机凭据的主体解密。服务主密钥只能由创建该服务的主Windows服务帐户或有权访问该服务帐户名及其密码的主体打开。
每个SQL实例有且仅有一个服务主密钥,从SQL 2012开始,使用AES加密算法来保护服务主密钥(SMK)和数据库主密钥(DMK)。
数据库主密钥(Database master keys,DMK)
数据库主密钥是对称密钥,受到服务主密钥(Service Master Key)或密码的保护,用于保护证书中的私钥和数据库中存在的非对称密钥。在数据库主密钥创建时,使用AES_256算法和用户提供的密码对数据库主密钥进行加密。为了启用主密钥的自动解密,可以使用服务主密钥(SMK)对数据库主密钥的副本进行加密,并将其存储在数据库和master数据库中。默认情况下,每当更改主密钥时,存储在master数据库中的副本都会以静默方式进行更新。master数据库中的sys.databases目录视图的is_master_key_encrypted_by_server列指示数据库主密钥是否已由服务主密钥加密。
默认情况下,使用SMK对DMK进行加密,也可以修改该默认设置:
ALTER MASTER KEY ADD ENCRYPTION BY { SERVICE MASTER KEY | PASSWORD = 'password' } | DROP ENCRYPTION BY { SERVICE MASTER KEY | PASSWORD = 'password' }
当使用ADD ENCRYPTION BY SERVICE MASTER KEY 选项时,使用服务主密钥对DMK进行加密,并把主密钥存储到当前数据库和master数据库中。 DROP ENCRYPTION BY SERVICE MASTER KEY选项用于移除通过SMK对DMK的加密,此时应该使用密码对DMK进行加密。
如果使用密码对DMK进行加密,必须使用OPEN MASTER KEY语句和密码来打开未由服务主密钥加密的主密钥。
三,加密的分层结构
SQL Server使用分层加密和密钥管理基础结构来加密数据,每一层通过使用证书(Certificate),非对称密钥(Asymmetric Key)和对称密钥(Symmetric Key)的组合来加密其下面的层。可以把非对称密钥和对称密钥存储在SQL Server外部的可扩展密钥管理(Extensible Key Management,EKM)模块中。
下图显示了加密层次结构的每一层都对其下面的层进行了加密,并显示了最常见的加密配置。通常使用密码来保护对层次结构起点的访问:
在上图中,PW是指密码(PassWord),可扩展密钥管理(EKM)模块在SQL Server外部保存对称或非对称密钥。
从加密性能上来看,对称加密的性能最好,优于证书和非对称加密。
四,保护主密钥
应该在创建服务主密钥或数据库主密钥时,尽快备份主密钥,把主密钥保存在安全的异地位置上。
如果数据库主密钥使用SMK加密,那么在备份时不需要显式打开;如果数据库主密钥使用密码加密,在备份数据库主密钥之前,必须用密码打开,在数据库主密钥解密之后,才能备份。
1,备份和还原服务主密钥
对服务主密钥进行备份,需要使用密码对备份文件进行加密;在还原服务主密钥时,使用密码来解密备份文件。
BACKUP SERVICE MASTER KEY TO FILE = 'F:\keys\service_master_key' ENCRYPTION BY PASSWORD = 'Pa$$w0rd' ; RESTORE SERVICE MASTER KEY FROM FILE = 'F:\keys\service_master_key' ENCRYPTION BY PASSWORD = 'Pa$$w0rd' ;
2,保护数据库主密钥
在mster数据库中创建数据库主密钥,默认使用SMK对DMK进行加密;DMK可以同时由SMK和密码进行加密。
CREATE MASTER KEY [ ENCRYPTION BY PASSWORD ='password' ]
当DMK使用SMK进行加密时,它会在需要时自动打开;如果DMK使用密码进行加密,那么在使用时必须显式打开:
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
在打开DMK之后,在不用时,记得关闭DMK。在当前会话中,OPEN和CLOSE必须是成对出现的。
CLOSE MASTER KEY
如果数据库主密钥使用密码加密,在备份数据库主密钥之前,必须用密码打开,在数据库主密钥解密之后,才能备份。
--使用密码创建数据库主密钥 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd' ; --用密码打开数据库主密钥 OPEN MASTER KEY DECRYPTION BY PASSWORD = 'Pa$$w0rd'; BACKUP MASTER KEY TO FILE = 'F:\keys\DB_master_key' ENCRYPTION BY PASSWORD = 'Pa$$w0rd'; RESTORE MASTER KEY FROM FILE = 'F:\keys\DB_master_key' DECRYPTION BY PASSWORD = 'Pa$$w0rd'
参考文档:
Encryption Hierarchy
SQL Server and Database Encryption Keys (Database Engine)
SQL Server 安全篇——SQL Server加密(1)——加密概念
加载全部内容