数据加密 第四篇:对称密钥
悦光阴 人气: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)
加载全部内容