加密是指通过使用密钥或密码对数据进行模糊处理的过程,加密解密最简单的过程如下图所示:
对称加密是加密和解密使用同一个密钥的加密算法,在图中就是加密密钥和解密密钥是相同的。对称加密通常来说会比较羸弱,因为使用数据时不仅仅需要传输数据本身,还是要通过某种方式传输密钥,这很有可能使得密钥在传输的过程中被窃取。
非对称加密是加密和解密使用不同密钥的加密算法,在图中就是加密密钥和解密密钥是不同的。用于加密的密钥称之为公钥,用于解密的密钥称之为私钥。因此安全性相比对称加密来说会大大提高。当然有一长必有一短,非对称加密的方式通常算法会相比对称密钥来说复杂许多,因此会带来性能上的损失。
因此,一种折中的办法是使用对称密钥来加密数据,而使用非对称密钥来加密对称密钥。这样既可以利用对称密钥的高性能,还可以利用非对称密钥的可靠性。
没有一个加密算法能够适用所有的情况,在选择加密机制时,可以借鉴一些成功的经验:
- 强的加密通常意味着消耗更多的CPU资源;
- 长的密钥比短密钥的加密效果更好;
- 长密码比短密码的加密效果更好
- 非对称加密比对称加密更慢,但是加密效果更好;
- 如果要加密大量的数据,推荐使用对称密钥来加密数据,然后使用非对称密钥加密该非对称密钥。
- 密文不能被压缩,但是,压缩后的数据可以被加密,推荐在压缩数据后再对数据进行加密。
加密算法
加密算法用于把数据转换成密文,从SQL Server 2016 (13.x)开始,除了AES_128, AES_192 和 AES_256 之外,其他加密算法都已经过时了。
关于DES算法的说明:
- 使用ALGORITHM = TRIPLE_DES_3KEY 创建的对称密钥,是指192bit的TRIPLE DES
- 使用ALGORITHM = TRIPLE_DES 创建的对称密钥,是指128bit的TRIPLE DES
加密机制
SQL Server提供的加密方式主要是值级加密(Cell Level)和文件级别加密(TDE)。SQL Server提供的加密机制主要有:
- 加密函数:使用短语作为密码对数据进行加密
- 非对称密钥(Asymmetric keys)和对称密钥(Symmetric keys)
- 凭证(Certificates)
- 透明数据加密(Transparent Data Encryption,简称TDE),对整个数据库文件进行加密
使用短语加密数据
对于单个值,可以使用TSQL函数EncryptByPassPhrase()进行加密,使用DecryptByPassPhrase()进行解密。传递一个短语作为密码,使用128bit键长的TRIPLE DES 算法进行加密。
EncryptByPassPhrase ( 'passphrase', 'cleartext' [ , add_authenticator , authenticator ] ) DecryptByPassPhrase ( 'passphrase', 'ciphertext' [ , add_authenticator ,authenticator ] )
参数注释:
- passphrase:字符串,用于生成对称键
- cleartext:需要加密的字符串,数据类型可以是:nvarchar, char, varchar, binary, varbinary, 或 nchar,不能超过8000Bytes。
- ciphertext:密文,是加密之后的数据,数据类型是varbinary。
- add_authenticator:布尔值,是否把authenticatory和cleartext以及加密。如果是1,authenticator参数必须有值。默认值是0,可以省略参数add_authenticator和authenticator。
- authenticator:sysname类型,用于指示身份验证者
返回值:这两个函数的返回值都是varbinary,最大长度是8000Bytes。
举个例子,使用这两个函数对数据进行加密和解密:
declare @cipher varbinary(8000) select @cipher=Encryptbypassphrase(N'悦光阴','A good man') select @cipher as EncryptedText,cast(Decryptbypassphrase(N'悦光阴',@cipher) as varchar(128)) as DecryptedText
参考文档: