数据加密 第四篇:对称密钥

密钥分为对称密钥和非对称密钥,密钥本质上是加密数据的算法:

  • 对称密钥(Symmetric Keys)是指加密和解密的过程使用相同的算法,是加密中最弱的算法,但是性能最好。对于对称密钥,可以使用密码或者另一个密钥甚至一个证书来加密。
  • 非对称密钥(Asymmetric Keys)使用一对密钥(算法),一个密钥用于加密,另一个密钥用于解密,加密的密钥称为私钥(private key),解密的密钥称为公钥(public key)。

不管对称密钥,还是非对称密钥,都不能备份。在加密体系中,能够备份的只有SMK、DMK和证书。

对称密钥(Symmetric Keys)

对称密钥是指数据的加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。不过即使是最弱的算法,也能增加数据防御的能力,毕竟不是每个攻击者都是顶级的。对于对称密钥,可以使用密码,或者另一个密钥,甚至一个证书来加密。

一,创建对称密钥

创建对称密钥时,需要制定对数据进行加密的算法,对称密钥必须用至少一个方式来加密:certificate, password, symmetric key, asymmetric key, 或 PROVIDER,密钥可以同时有多种加密方式。

CREATE SYMMETRIC KEY key_name   
WITH ALGORITHM = { AES_128 | AES_192 | AES_256 }
     , ENCRYPTION BY <encrypting_mechanism> [ , ... n ] 
  
<encrypting_mechanism> ::=  
      CERTIFICATE certificate_name   
    | PASSWORD = 'password'   
    | SYMMETRIC KEY symmetric_key_name   
    | ASYMMETRIC KEY asym_key_name  

举个例子,创建一个对称密钥,使用AES_256对数据进行加密,并使用证书对密钥进行加密:

CREATE SYMMETRIC KEY JanainaKey09   
WITH ALGORITHM = AES_256  
ENCRYPTION BY CERTIFICATE Shipping04;  
GO  

二,使用对称密钥来加密和解密数据的函数

在对称密钥创建完成之后,要使用对称密钥对数据进行加密,首先要打开对称密钥,对称密钥的GUID可以通过函数key_GUID('name')来获得:

OPEN SYMMETRIC KEY Key_name DECRYPTION BY <decryption_mechanism>  
  
<decryption_mechanism> ::=  
    CERTIFICATE certificate_name [ WITH PASSWORD = 'password' ]  
    | ASYMMETRIC KEY asym_key_name [ WITH PASSWORD = 'password' ]  
    | SYMMETRIC KEY decrypting_Key_name  
    | PASSWORD = 'decryption_password'  

当对称密钥打开之后,使用EncryptByKey ()来对数据进行加密,返回值是varbinar,最大长度是8000Bytes:

EncryptByKey ( key_GUID , { 'cleartext' | @cleartext }  
    [, { add_authenticator | @add_authenticator }  
     , { authenticator | @authenticator } ] ) 

使用DecryptByKey ()来对数据进行解密:

DecryptByKey ( { 'ciphertext' | @ciphertext }   
    [ , add_authenticator, { authenticator | @authenticator } ] ) 

在不使用对称密钥时,把密钥关闭:

CLOSE SYMMETRIC KEY key_name

三,使用对称密钥来加密和解密数据的实例

创建证书来对对称密钥进行加密。

1,使用对称密钥加密数据

Step1,创建证书,并使用数据库主密钥来加密证书

CREATE CERTIFICATE CreditCardCert 
WITH SUBJECT = 'Credit Card Numbers';

Step2:创建对称密钥

创建一个名称为CreditCardKey的对称密钥,使用AES_128加密算法,并使用证书对密钥进行加密

CREATE SYMMETRIC KEY CreditCardKey 
WITH ALGORITHM = AES_128
ENCRYPTION BY CERTIFICATE CreditCardCert; 

从 SQL Server 2016开始,除 AES_128、AES_192 和 AES_256 以外的所有算法都已过时。

Step 3:解密对称密钥并使其可供使用

使用密钥前需要解密对称密钥,然后打开密钥,否则密钥不可用

OPEN SYMMETRIC KEY CreditCardKey DECRYPTION BY CERTIFICATE CreditCardCert; 

Step4:使用密钥对数据进行加密

调用ENCRYPTBYKEY()函数使用对称密钥对数据进行加密

UPDATE Sales.CreditCard 
SET CardNumberEncrypted = ENCRYPTBYKEY(Key_GUID('CreditCardKey'), CardNumber); 

函数 KEY_GUID('key_name')返回对称密钥的GUID。

Step 5:关闭密钥

密钥的打开状态对当前Session起作用,在使用玩密钥之后,应该及时把密钥关闭。

CLOSE SYMMETRIC KEY CreditCardKey ;

2,解密对称密钥

首先打开对称密钥,然后使用对称密钥解密数据,最后关闭密钥

OPEN SYMMETRIC KEY CreditCardKey DECRYPTION BY CERTIFICATE CreditCardCert; 
 
SELECT CONVERT(NVARCHAR(30), DECRYPTBYKEY(CardNumberEncrypted)) AS CreditCardNumber 
FROM Sales.CreditCard ; 

CLOSE SYMMETRIC KEY CreditCardKey ; 

四,对称密钥的使用

在使用对称密钥时,信息的发送方和接收方用一个密钥去加密和解密数据,它的最大优势是加/解密速度快,适合于对大数据量进行加密,对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。

 

对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

 

参考文档:

 CREATE SYMMETRIC KEY (Transact-SQL)

posted @ 2020-05-18 11:31  悦光阴  阅读(418)  评论(2编辑  收藏