亲宝软件园·资讯

展开

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

悦光阴 人气:0

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

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

对称密钥(Symmetric Keys)

虽然是“钥匙”,但是本质是加密数据的算法,并且是加密中最弱的算法,这是因为使用相同的算法来加密和解密数据。不过即使是最弱的算法,也能增加数据防御的能力,毕竟不是每个攻击者都是顶级的。对于对称密钥,可以使用密码,或者另一个密钥,甚至一个证书来加密。

非对称密钥(Asymmetric Keys)

跟对称密钥相对,它使用一对密钥(算法),一个密钥用于加密,另一个密钥用于解密,加密的密钥称为私钥(private key),解密的密钥称为公钥(public 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 ; 

 

参考文档:

 CREATE SYMMETRIC KEY (Transact-SQL)

加载全部内容

相关教程
猜你喜欢
用户评论