密钥分为对称密钥和非对称密钥,密钥本质上是加密数据的算法:
- 对称密钥(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。
对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。
参考文档: