数据加密 第一篇:加密的概念

加密是通过使用密钥或密码来混淆数据的处理过程,把明文处理为密文,如果没有拿到相应的解密密钥或密码,即使拿到密文,也是无用,因此加密是保护数据的一个方法。用户只有拿到密钥和证书把密文数据解密之后,才能使用数据。如果没有密钥和证书,即使得到了数据,也无法得知数据的原始值,数据就没有价值了。由于数据的加密和解密是一种资源密集性(特别是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中是高层加密

 

对于证书,对称密钥和非对称密钥:

  • Service master key 和database master key 都是一种Symmetric key,
  • 在正常的情况下,对于证书、对称性密钥、非对称性密钥,每次生成的都不一样,即使命令相同。
  • 对于非对称性密钥,密钥不可以备份或复制,一旦创建,公钥和私钥永远一样。
  • 对于证书,可以导出证书的副本,方便对证书进行还原。

二,SQL Server加密概念

服务主密钥(Service Master Key,SMK)
服务主密钥是SQL Server加密层次结构的根。在安装SQL Server实例后,第一次启动SQL Server会自动生成SMK,用于加密数据库主密钥(DMK)、凭证(credentials)和链接服务器的密码。SQL Server通过使用Windows数据保护API(DPAPI)或本地主机的密钥来加密SMK,DPAPI通过使用从SQL Server服务帐户的Windows凭据和计算机的凭据派生的密钥来加密SMK,这意味着,加密SMK的密钥只跟SQL Server实例所在的主机有关。

如果要修改SQL Server服务的账户,请使用SQL Server配置管理器。为了实现服务帐户的更改,SQL Server存储受计算机帐户保护的服务主密钥的冗余副本,该计算机账户被授予访问SQL Server服务组的必要权限。如果重建计算机,则以前由服务帐户使用的相同域用户(Domain User)可以恢复服务主密钥。除了域用户之外,本地帐户或Local System, Local Service, 或 Network Service帐户不能用于回复SMK。如果需要把SQL Server转移到另一台计算机,请使用备份和还原迁移服务主密钥。

从SQL Server 2012开始,使用AES算法来加密SMK和DMK。服务主密钥只能由创建它的服务帐户或有权访问计算机凭据的主体解密。服务主密钥只能由创建该服务的主Windows服务帐户或有权访问该服务帐户名及其密码的主体打开。每个SQL实例有且仅有一个服务主密钥,从SQL 2012开始,使用​​AES加密算法来保护服务主密钥(SMK)和数据库主密钥(DMK)。

ALTER SERVICE MASTER KEY 
 [ FORCE ] REGENERATE

REGENERATE短语用于重新生成服务主密钥,当重新生成服务主密钥后,SQL Server解密使用它加密的所有密钥,然后使用新的服务主密钥对它们进行加密。这是一项资源密集型操作,除非密钥已被盗用,否则您应该在需求低的时期内安排此操作。如果任何解密失败,则整个语句都会失败。

当无法检索当前的主密钥,或者无法使用SMK解密私钥时,考虑使用FORCE选项,它强制密钥重新生成。注意,仅当REGENERATE失败并且无法使用RESTORE SERVICE MASTER KEY语句还原服务主密钥时,才使用FORCE选项。

 

数据库主密钥(Database master keys,DMK)

数据库主密钥是对称密钥,受到服务主密钥(Service Master Key)或密码的保护,用于保护证书和非对称密钥的私钥。DMK也可以加密数据,但是有长度的限制,与对称密钥相比,它对数据的实用性较差。

在数据库主密钥创建时,使用AES_256算法,用户提供的密码或SMK对数据库主密钥进行加密。为了数据库启用主密钥的自动解密,可以使用服务主密钥(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' 
DECRYPTION BY PASSWORD = 'Pa$$w0rd' ; 

2,创建数据库主密钥

在mster数据库中创建数据库主密钥,默认使用SMK对DMK进行加密,推荐使用默认的加密方式。

CREATE MASTER KEY [ ENCRYPTION BY PASSWORD ='password' ]

当使用ENCRYPTION BY PASSWORD ='password' 选项时,使用密码对DMK进行加密;当省略该选项时,使用SMK对DMK进行加密。

3,备份和还原DMK

当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 = 'back_Pwd'; 

RESTORE MASTER KEY 
FROM FILE = 'F:\keys\DB_master_key' 
DECRYPTION BY PASSWORD = 'back_Pwd'  

 

 

参考文档:

SQL Server and Database Encryption Keys (Database Engine)

Encryption Hierarchy

SQL Server and Database Encryption Keys (Database Engine)

SQL Server 安全篇——SQL Server加密(1)——加密概念

 

posted @ 2020-05-17 18:12  悦光阴  阅读(2268)  评论(0编辑  收藏  举报