数据加密概述: 为什么要对数据库进行加密? 数据面临的威胁和数据库加密的必要性-->渗透攻击、数据偷窃、数据存储设备失窃 80%的计算机犯罪来自系统内部,数据库管理员是否100%的可信 数据库安全-最后的防线 数据加密: 加密是保护数据的机制,通过加密确保只有授权的用户才可以访问和读取相应的数据 加密过程=加密算法+密钥
什么是数据加密? SQL Server 2005实现了完整的加密基础结构-->支持的加密类型: 对称加密 非对称加密 证书 函数: 加密、解密函数 数字签署函数-->见下图:
对称数据加密-->加密和解密使用相同的密钥 特点: 速度快,对系统的资源占用低 密钥的安全分发管理困难 见下图:
非对称数据加密-->加密和解密使用不同的密钥来完成 特点: 加密解密速度慢,较高的系统资源占用 方便进行密钥分发 见下图:
混合数据加密-->结合对称加密与非对称加密技术 加密过程: 随机生成对称密钥加密数据 使用公钥加密对称密钥 见下图:
解密过程: 用私钥解开被加密的对称密钥 使用对称密钥解密数据 见下图:
数据证书-->数字证书: 包含非对称密钥中的公钥,证明实体拥有对应私钥的数字签名 使用数字证书: 加密受保护的数据 对数据进行数字签名 证书颁发机构
数据库加密体系结构: SQL 2005的加密层次-->见下图:
密钥保护机制-->见下图:
服务主密钥: 服务主密钥-->在安装SQL Server时自动生成,是128bit的3DES密钥 直接或间接地保护树中的所有其他密钥 使用SQL Server 2005的配置管理器更改服务账户,能够自动完成解密和加密过程 备份、还原服务主密钥-->见下列语句:
[BACKUP SERVICE MASTER KEY TO FILE = 'C:\SMK.bak'
ENCRYPTION BY PASSWORD = 'P@ssword'
RESTORE SERVICE MASTER KEY FROM FILE = 'C:\SMK.bak'
DECRYPTION BY PASSWORD = 'P@ssword']
数据库主密钥(1): 数据库主密钥-->在数据库级别启用加密功能前必须先创建数据库主密钥 由密码保护或者由服务主密钥保护 是128bit的3DES密钥 创建数据库主密钥-->见下列语句:
[CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssword']
数据库主密钥(2): 使用数据库主密钥-->如果数据库主密钥使用服务主密钥进行保护,则在使用时会自动打开 数据库主密钥的打开和关闭-->语句:[OPEN MASTER KEY DECRYPTION BY PASSWORD = 'P@ssword'] 修改数据库主密钥-->重新生成数据库主密钥 可以不使用服务主密钥保护数据库主密钥
数据库主密钥(3): 查看数据库主密钥状态-->sys.symmetric_keys目录视图中查看有关数据库主密钥的信息 sys.databases目录视图的is_master_key_encrypted_by_server列指示是否使用服务主密钥对数据库主密钥进行加密 备份和还原数据库主密钥-->见下列语句:
[BACKUP MASTER KEY TO FILE = 'C:\DMK.bak'ENCRYPTION BY PASSWORD = 'P@ssword'
RESTORE MASTER KEY FROM FILE = 'C:\DMK.bak'DECRYPTION BY PASSWORD = 'P@ssword' ENCRYPTION BY PASSWORD = 'Pa$$word']
使用数据库加密保护数据: 数字证书(1)-->创建证书: SQL 2005自签名的证书(包含私钥) 使用来自文件、签名的可执行文件、dll文件创建证书-->见下列语句:
[CREATE CERTIFICATE cert_myCert
ENCRYPTION BY PASSWORD = 'P@ssword'
WITH SUBJECT = 'Self Signed Cert',
START_DATE = '2/4/2009'
EXPIRY_DATE = '2/4/2011']
数字证书(2)-->更改证书: 更改用于加密证书私钥的密码 添加删除证书的私钥-->见下列语句:
[ALTER CERTIFICATE cert_MyCert
WITH PRIVATE KEY(FILE = 'c:\MyCertPvt',
DECRYPTION BY PASSWORD = 'P@ssword')
ALTER CERTIFICATE cert_MyCert REMOVE PRIVATE KEY]
数字证书(3)-->备份证书: 利用备份导出证书和对应的私钥 使用CREATE CERTIFICATE对证书的进行还原-->见下列语句:
[BACKUP CERTIFICATE cert_MyCert
To FILE = 'c:\mycert.cer'WITH PRIVATE
KEY(DECRYPTION BY PASSWORD = 'P@ssword',FILE = 'c:\mycertpvt',ENCRYPTION BY PASSWORD = 'Pa$$word')]
数字证书(4)-->与证书相关的函数: EncryptByCert(certificate_ID,'cleartext') DecryptByCert(certificate_ID,'ciphertext','cert_password') Cert_ID('cert_name') CertProperty(Cert_ID,'<PropertyName>') SignByCert(certificate_ID,'clear_text','password') VerifySignedByCert(Cert_ID,signed_data,signature)
非对称密钥(1)-->创建非对称密钥: 创建新的密钥对 使用已有的密钥对文件创建-->可以使用强命名工具sn.exe生成密钥对 见下列语句:
[CREATE ASYMMETRIC KEY asy_Key1
WITH ALGORITHM = RSA_2048
ENCRYPTION BY PASSWORD = 'P@ssword']
非对称密钥(2)-->修改非对称密钥: 删除密钥对私钥 修改私钥保护的方法 见下列语句:
[ALTER ASYMMETRIC KEY asy_Key1
WITH PRIVATE KEY
(DECRYPTION BY PASSWORD = 'Pa$$word',
ENCRYPTION BY PASSWORD = 'P@ssword')
非对称密钥(3)-->非对称加密相关函数: EncryptByAsymKey(Asym_Key_ID,'cleartext') DecryptByAsymKey(Asym_key_ID,'ciphertext','password') AsymKey_ID('Asym_Key_Name') SignByAsymKey(Asym_Key_ID,@cleartext,'password') VerifySignedByAsymKey(Asym_Key_ID,clear_text,signature)
对称密钥(1)-->创建对称密钥: 创建时必须使用至少一种方法对其进行加密-->证书/密码/对称密钥/非对称密钥 可以同时用多种方法对密钥进行保护 见下列语句:
[CREATE SYMMETRIC KEY sym_Key1
WITH ALGORITHM=AES_256
ENCRYPTION BY CERTIFICATE cert_MyCert]
对称密钥(2)-->使用密钥: 使用前必须打开对称密钥 通过sys.open_keys查看打开的密钥 见下列语句:
[OPEN SYMMETRIC KEY SymKeyMarketing3
DECRYPTION BY CERTIFICATE cert_MyCert;
对称密钥(3)-->修改对称密钥: 添加、删除对密钥的保护 见下列语句:
OPEN SYMMETRIC KEY sym_key1 DECRYPTION BY CERTIFICATE cert_MyCert
ALTER SYMMETRIC KEY sym_key1 ADD ENCRYPTION BY PASSWORD = 'P@ssword'
ALTER SYMMETRIC KEY sym_key1 DROP ENCRYPTION BY CERTIFICATE Shipping04
CLOSE SYMMETRIC KEY sym_key1
对称密钥(4)-->对称密钥相关函数 见下列语句:
EncryptByKey(key_GUID,'cleartext',add_authenticator,authenticator)
DecryptByKey('ciphertext',add_authenticator,authenticator)
EncryptByPassPhrase('passphrase','cleartext',add_authenticator,
authenticator)
DecryptByPassPhrase('passphrase','ciphertext',add_authenticator,
authenticator)
Key_ID('Key_Name')
Key_GUID('Key_Name')
了解数据库加密体系结构
展开SQL2005(服务器名称)--数据库--可以看到我已经提前创建一个叫做Northwind的数据库了 我主要在这个数据库上进行操作 对着Northwind右键--选择属性--按选项 注意: 如果恢复模式是完整的话,兼容级别一定要设置成SQL Server 2005(90),不能设置成SQL Server 2000(80)
服务主密钥是不能够创建或者把它删除的 它是由SQL Server 2005安装的时候自动生成的 我们能做的就是对它进行备份 1.全选备份服务主密钥到文件的语句--按执行之后就生成一个叫做SMK.bak的文件在C盘的DBFile这个文件夹里面了 我们还可以生成新的服务主密钥 假如说有一天你怀疑你的服务主密钥泄漏或者失去了 这个时候你可以生成新的服务主密钥 2.全选生成新的服务主密钥的语句--按执行 3.全选从备份文件还原服务主密钥的语句--按执行之后就从备份文件还原服务主密钥了
1.全选为Northwind数据库创建数据库主密钥的语句--按执行 2.全选查看数据库加密状态的语句--按执行之后就可以看到加密状态的信息了 3.全选查看数据库主密钥的信息语句--按执行之后可以看到加密的类型是TRIPLE_DES 长度是128位的密钥
4.我们应该对数据库主密钥进行备份 因为它是这个数据库中所有其它加密密钥的保护根 所以我们应该对它进行备份 全选对数据库主密钥进行备份的语句--按执行之后可以看到生成一个叫做DMK.bak的文件在C盘的DBFile这个文件夹里面 如果碰到一些意外情况的时候 我们可以把这个做好的备份还原回去 5.全选创建非对称密钥成功,自动使用服务主密钥解密并使用该数据库主密钥的语句--按执行 展开数据库--Northwind--安全性--非对称密钥--可以看到已经生成一个叫做asy_TestKey1的非对称密钥了 5.全选删除服务主密钥对数据库主密钥的保护语句--按执行 5.全选查看数据库的加密状态语句--按执行之后可以看到Northwind这个数据库的标志从1变成0了 表明当前这个数据库的主密钥没有被服务主密钥所保护
全选创建非对称密钥失败,数据库主密钥未打开的语句--按执行之后可以看到有一个提示-->在执行此操作之前,请在数据库中创建一个主密钥或在会话中打开该主密钥。表明创建失败了 为什么会失败呢? 因为当前数据库的主密钥不会自动打开,必须手动打开它才能创建非对称密钥了 全选打开数据库主密钥未的语句--按执行之后可以看到当前打开的对称密钥信息了 全选创建非对称密钥成功的语句--按执行 展开数据库--Northwind--安全性--非对称密钥--可以看到成功生成一个叫做asy_TestKey2的非对称密钥了 全选恢复服务主密钥对数据库主密钥的保护语句--按执行之后就恢复到默认的状况了
1.全选让SQL2005创建自签名的证书语句--按执行 展开数据库--Northwind--安全性--证书--可以看到已经成功创建一个叫做cert_TestCert1的证书了 2.我也可以从外部导入一个证书 全选从文件导入证书的语句--按执行之后就导入一个证书了 注意:现在我的C盘的DBFile这个文件夹里面没有一个叫做MSCert.cer的证书 如果有的话肯定是能够导入成功的 选定SELECT * FROM sys.certificates这条语句--按执行之后就可以看到刚才创建证书的信息了
3.全选备份导出证书和私钥的语句--按执行之后就生成一张叫做TestCert1.cer的证书在C盘的DBFile这个文件夹里面了 双击打开这张证书之后会发现颁发给和颁发者都是TestCert1-->表明这就是自签名证书 4.全选使用证书加密、解密数据的语句--按执行之后可以看到一些信息 上面的就是进行加密以后的密文 下面的就是解密以后的原文 这就是加密的过程
5.刚才是使用公钥加密和使用私钥解密的 全选删除证书私钥的语句--按执行 全选加密成功,解密失败的语句--按执行之后可以看到加密成功了 但是解密失败了
1.如果你安装了Microsoft Visual Studio 2005的话会在目录里面找到一个命令行工具 我们可以使用sn -k C:\DBFile\asy_Test.key这条语句来创建一个非对称密钥 2.全选从文件创建非对称密钥的语句--按执行 全选SELECT * FROM sys.asymmetric_keys这条语句--按执行之后可以看到所有的非对称密钥的信息了
加密列数据(1): 数据列加密-->使用对称密钥加密大量的列数据 考虑使用证书、非对称密钥保护对称密钥
加密列数据(2): 防止绕过加密数据列的攻击-->使用验证器
加密列数据(3): 加密列数据的考虑-->在加密列上的索引将变得无效 加密数据列的长度增长,建议使用varbinary(max)数据类型 修改已有的DML语句以支持加密的数据列
如何使用加密保护列数据呢?
1.全选创建示例表的语句--按执行 展开数据库--Northwind--表--可以看到刚才创建的dbo.EmpSalary这张表了 2.全选创建数据库主密钥的语句--按执行之后会看到数据库中已存在主密钥。执行此语句前,请先删除该主密钥。为什么会提示呢? 因为刚才已经创建主密钥了
3.全选创建用于加密的对称密钥的语句--按执行之后可以看到对称密钥的详细信息了 展开数据库--Northwind--安全性--对称密钥 可以看到刚才创建的sym_Salary这个对称密钥了
1.全选打开对称密钥的语句--按执行 全选查看打开的对称密钥的语句--按执行之后可以看到当前打开对称密钥的信息了 2.全选向表中插入数据,并对Salary列的数据进行加密的语句--按执行 3.全选关闭打开的对称密钥的语句--按执行 全选查看打开的对称密钥的语句--按执行之后可以看到什么都没有了 因为关闭打开的对称密钥了 4.全选查看表中存放的数据的语句--按执行之后可以看到插入的三行数据的内容 只是Salary这一列的内容是经过加密了
1.全选打开对称密钥的语句--按执行 2.全选使用对称密钥解密并访问被加密了的数据列的语句--按执行之后可以看到解密后的值了 3.全选关闭对称密钥的语句--按执行
1.全选攻击者使用其它数据行的加密数据替换某一行的数据的语句--按执行 2.全选查看被攻击后解密的数据的语句--按执行之后可以看到CEO的Salary和DB Admin的Salary变成一样了 这样数据的完整性和机密性其实就已经被攻击行为所破坏了
1.全选删除前面添加的数据行的语句--按执行 2.全选向表中插入数据,并对Salary列的数据使用验证器进行加密的语句--按执行 3.全选解密并访问被加密了的数据列的语句--按执行之后可以看到解密的结果是一样的 只不过在解密的时候需要带上验证因子进行解密
4.全选攻击者使用相同的方法篡改数据的语句--按执行 5.全选被篡改后的加密了的数据列变成无效的语句--按执行之后会发现虽然攻击方法跟刚才一样 但是结果不一样了 可以看到DB Admin这一列解密后结果是NULL NULL的意思就是这个数据被恶意地篡改了 通过这种方法可以防止这种绕过加密而进行数据攻击的方法
用证书签署存储过程(1): 签署存储过程的目的-->以证书对应用户的权限上下文执行存储过程 防止拥有权链断裂造成用户不能通过存储过程访问基表数据
用证书签署存储过程(2): 签署存储过程的实现步骤-->创建证书 使用证书创建用户,并为该用户授予相应权限 创建存储过程,并使用证书签署存储过程
如何使用数字证书签署存储过程呢?
1.全选创建数据库主密钥的语句--按执行 2.全选创建签署存储过程所需要的证书的语句--按执行 3.全选创建SPDeveloper登录账户和用户,该用户创建访问Products表的存储过程的语句--按执行
4.全选以SPDeveloper的身份创建存储过程products.usp_Products的语句--按执行 5.全选创建普通用户Jerry的语句--按执行
1.全选授予用户Jerry执行存储过程的根限的语句--按执行 2.全选以Jerry的身份执行存储过程失败,因为拥有全链是断裂的语句--按执行 3.全选使用证书在当前数据库创建用户ProductReader,并为该用户授予读取Products表的根限的语句--按执行
4.全选使用证书签署当前存储过程的语句--按执行 5.全选以Jerry的身份重新执行存储过程的语句--按执行之后就可以看到存储过程的详细信息了 这就是我们使用证书对存储过程进行数字签署以后达到这样一种目的