--==================(I)服务主密钥=====================

--1.)备份服务主密钥到文件

BACKUP SERVICE MASTER KEY TO FILE = 'C:\DBFile\SMK.bak'ENCRYPTION BY PASSWORD = 'P@ssw0rd'

--2.)生成新的服务主密钥

ALTER SERVICE MASTER KEY REGENERATE;

GO

--3.)从备份文件还原服务主密钥

RESTORE SERVICE MASTER KEY FROM FILE = 'C:\DBFile\SMK.bak' DECRYPTION BY PASSWORD = 'P@ssw0rd'

--==================(II)数据库主密钥=====================

--1.)为Northwind数据库创建数据库主密钥

USE Northwind

GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd'

GO

--2.)查看数据库加密状态

SELECT [name], is_master_key_encrypted_by_server

FROM sys.databases WHERE name = 'Northwind';

GO

--3.)查看数据库主密钥的信息

USE Northwind

SELECT * FROM sys.symmetric_keys

GO

--4.)对数据库主密钥进行备份

USE Northwind

GO

BACKUP MASTER KEY

TO FILE = 'C:\DBFile\DMK.bak'

ENCRYPTION BY PASSWORD = 'P@ssw0rd!@'

GO

--5.)删除服务主密钥对数据库主密钥的保护

--     创建非对称密钥成功,自动使用服务主密钥解密并使用该数据库主密钥

CREATE ASYMMETRIC KEY asy_TestKey1 WITH ALGORITHM = RSA_1024

GO

--     删除服务主密钥对数据库主密钥的保护

ALTER MASTER KEY

DROP ENCRYPTION BY SERVICE MASTER KEY

GO

--      查看数据库的加密状态

SELECT [name], is_master_key_encrypted_by_server

FROM sys.databases WHERE name = 'Northwind';

--     创建非对称密钥失败,数据库主密钥未打开

CREATE ASYMMETRIC KEY asy_TestKey2 WITH ALGORITHM = RSA_1024

GO

--     打开数据库主密钥未

OPEN MASTER KEY DECRYPTION BY PASSWORD = 'P@ssw0rd'

SELECT * FROM sys.openkeys

--     创建非对称密钥成功

CREATE ASYMMETRIC KEY asy_TestKey2 WITH ALGORITHM = RSA_1024

GO

--     恢复服务主密钥对数据库主密钥的保护

ALTER MASTER KEY

ADD ENCRYPTION BY SERVICE MASTER KEYCLOSE MASTER KEY

--==================(III)证书=====================

--1.)让SQL2005创建自签名的证书

USE Northwind

GO

CREATE CERTIFICATE cert_TestCert1

ENCRYPTION BY PASSWORD = 'P@ssw0rd'

WITH SUBJECT = 'TestCert1',

START_DATE = '1/31/2006',

EXPIRY_DATE = '1/31/2008'

GO

SELECT * FROM sys.certificates

--2.)从文件导入证书

USE Northwind

GO

CREATE CERTIFICATE cert_TestCert2

FROM FILE = 'C:\DBFile\MSCert.cer'

GO

SELECT * FROM sys.certificates

--3.)备份导出证书和私钥

BACKUP CERTIFICATE cert_TestCert1

TO FILE = 'c:\DBFile\TestCert1.cer'

WITH PRIVATE KEY

(DECRYPTION BY PASSWORD = 'P@ssw0rd' ,

FILE = 'c:\DBFile\TestCert1_pvt' ,

ENCRYPTION BY PASSWORD = 'Pa$w0rd')

--4.)使用证书加密、解密数据

DECLARE @cleartext varbinary(200)

DECLARE @cipher varbinary(200)

SET @cleartext = CONVERT(varbinary(200), 'Test text string')

SET @cipher = EncryptByCert(Cert_ID('cert_TestCert1'), @cleartext)

SELECT @cipher

SELECT CONVERT(varchar(200), DecryptByCert(Cert_ID('cert_TestCert1'), @cipher, N'P@ssw0rd')) AS [ClearText]

--5.)删除证书私钥

ALTER CERTIFICATE cert_TestCert1

REMOVE PRIVATE KEY

Go

--    加密成功,解密失败

DECLARE @cleartext varbinary(200)

DECLARE @cipher varbinary(200)

SET @cleartext = CONVERT(varbinary(200), 'Test text string')

SET @cipher = EncryptByCert(Cert_ID('cert_TestCert1'), @cleartext)SELECT @cipherSELECT CONVERT(varchar(200), DecryptByCert(Cert_ID('cert_TestCert1'), @cipher, N'P@ssw0rd')) AS [ClearText]

--==================(IV)非对称密钥=====================

--1.)使用sn.ext生成非对成密钥文件

--     sn -k C:\DBFile\asy_Test.key

--2.)从文件创建非对称密钥

USE Northwind

GO

CREATE ASYMMETRIC KEY asy_Test

FROM FILE = 'C:\DBFile\asy_Test.key'

ENCRYPTION BY PASSWORD = 'P@ssw0rd'

GO

SELECT * FROM sys.asymmetric_keys

--==================(I)准备=====================
--1.)创建示例表
USE Northwind
IF EXIST dbo.EmpSalary DROP TABLE dbo.EmpSalary;

CREATE TABLE dbo.EmpSalary(
    EmpID int,
    Title nvarchar(50),
    Salary varbinary(500)
)
GO

--2.)创建数据库主密钥
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd'
GO

--3.)

--4.)创建用于加密的对称密钥
CREATE SYMMETRIC KEY sym_Salary
    WITH ALGORITHM = AES_192
    ENCRYPTION BY PASSWORD = 'P@ssw0rd';

SELECT * FROM sys.symmetric_keys WHERE [name] = 'sym_Salary'

--==================(II)加密列数据=====================

--1.)打开对称密钥
OPEN SYMMETRIC KEY sym_Salary
    DECRYPTION BY PASSWORD = 'P@ssw0rd'

SELECT * FROM sys.openkeys        --查看打开的对称密钥

--2.)向表中插入数据,并对Salary列的数据进行加密
INSERT INTO EmpSalary VALUES (1, 'CEO', EncryptByKey(KEY_GUID('sym_Salary'), '20000'))
INSERT INTO EmpSalary VALUES (2, 'Manager', EncryptByKey(KEY_GUID('sym_Salary'), '10000'))
INSERT INTO EmpSalary VALUES (3, 'DB Admin', EncryptByKey(KEY_GUID('sym_Salary'), '5000'))

--3.)关闭打开的对称密钥
CLOSE SYMMETRIC KEY sym_Salary

SELECT * FROM sys.openkeys        --查看打开的对称密钥

--4.)查看表中存放的数据
SELECT * FROM EmpSalary

--==================(III)解密并访问被加密了的数据列=====================
--1.)打开对称密钥
OPEN SYMMETRIC KEY sym_Salary DECRYPTION BY PASSWORD = 'P@ssw0rd'

--2.)使用对称密钥解密并访问被加密了的数据列
SELECT EmpID, Title, CAST(DecryptBykey(Salary) AS VARCHAR(20)) AS Salary FROM EmpSalary

--3.)关闭对称密钥
CLOSE SYMMETRIC KEY sym_Salary

--==================(III)绕过加密数据的攻击=====================
--1.)攻击者使用其它数据行的加密数据替换某一行的数据
SELECT * FROM EmpSalary
UPDATE EmpSalary SET Salary =
    (SELECT Salary FROM EmpSalary WHERE EmpID = 1)
    WHERE EmpID = 3

--2.)查看被攻击后解密的数据
OPEN SYMMETRIC KEY sym_Salary DECRYPTION BY PASSWORD = 'P@ssw0rd'
SELECT EmpID, Title, CAST(DecryptBykey(Salary) AS VARCHAR(20)) AS Salary FROM EmpSalary
CLOSE SYMMETRIC KEY sym_Salary

--==================(IV)使用验证器防止绕过加密数据的攻击=====================
--1.)删除前面添加的数据行
DELETE FROM EmpSalary

--2.)向表中插入数据,并对Salary列的数据使用验证器进行加密,第四个参数是加密因子
OPEN SYMMETRIC KEY sym_Salary DECRYPTION BY PASSWORD = 'P@ssw0rd'
INSERT INTO EmpSalary VALUES (1, 'CEO', EncryptByKey(KEY_GUID('sym_Salary'), '20000', 1, '1'))
INSERT INTO EmpSalary VALUES (2, 'Manager', EncryptByKey(KEY_GUID('sym_Salary'), '10000', 1, '2'))
INSERT INTO EmpSalary VALUES (3, 'DB Admin', EncryptByKey(KEY_GUID('sym_Salary'), '5000', 1, '3'))
CLOSE SYMMETRIC KEY sym_Salary

--3.)解密并访问被加密了的数据列
OPEN SYMMETRIC KEY sym_Salary DECRYPTION BY PASSWORD = 'P@ssw0rd'
SELECT EmpID, Title, CAST(DecryptBykey(Salary, 1, CAST(EmpID AS VARCHAR(3))) AS VARCHAR(20)) AS Salary FROM EmpSalary
CLOSE SYMMETRIC KEY sym_Salary

--4.)攻击者使用相同的方法篡改数据
SELECT * FROM EmpSalary
UPDATE EmpSalary SET Salary =
    (SELECT Salary FROM EmpSalary WHERE EmpID = 1)
    WHERE EmpID = 3

--5.)被篡改后的加密了的数据列变成无效
OPEN SYMMETRIC KEY sym_Salary DECRYPTION BY PASSWORD = 'P@ssw0rd'
SELECT EmpID, Title, CAST(DecryptBykey(Salary, 1, CAST(EmpID AS VARCHAR(3))) AS VARCHAR(20)) AS Salary FROM EmpSalary
CLOSE SYMMETRIC KEY sym_Salary

--==================(I)示例准备=====================
--1.)创建数据库主密钥
USE Northwind
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd'

--2.)创建签署存储过程所需要的证书
CREATE CERTIFICATE cert_Products
    WITH SUBJECT = 'Products Sign',
    START_DATE = '2006/1/1',
    EXPIRY_DATE = '2008/1/1'

--3.)创建SPDeveloper登录帐户和用户,该用户创建访问Products表的存储过程
CREATE LOGIN [SPDeveloper] WITH PASSWORD=N'P@ssw0rd', DEFAULT_DATABASE=[Northwind]
GO
CREATE USER [SPDeveloper] FOR LOGIN SPDeveloper WITH DEFAULT_SCHEMA=[SPDeveloper]
GO
CREATE SCHEMA products AUTHORIZATION SPDeveloper
GO
EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'SPDeveloper'

--4.)以SPDeveloper的身份创建存储过程products.usp_Products
EXECUTE AS USER = 'SPDeveloper'
GO
CREATE PROCEDURE products.usp_Products
AS
    SELECT TOP 5 * FROM dbo.Products
GO

REVERT
SELECT USER

--4.)创建普通用户Jerry
CREATE LOGIN jerry WITH PASSWORD=N'P@ssw0rd', DEFAULT_DATABASE=[Northwind]
CREATE USER jerry FOR LOGIN jerry

--==================(II)使用证书签署存储过程=====================
--1.)授予用户Jerry执行存储过程的权限
GRANT EXECUTE ON products.usp_Products TO jerry

--2.)以Jerry的身份执行存储过程失败,因为拥有全链是断裂的
EXECUTE AS USER = 'jerry'
SELECT USER
GO

EXECUTE products.usp_Products
GO

REVERT

--3.)使用证书在当前数据库创建用户ProductsReader,
--     并为该用户赋予读取Products表的权限
CREATE USER ProductsReader FOR CERTIFICATE cert_Products
GO
GRANT SELECT ON Products TO ProductsReader

--4.)使用证书签署当前存储过程
ADD SIGNATURE TO products.usp_Products BY CERTIFICATE cert_Products

--4.)以Jerry的身份重新执行存储过程,成功,
--     因为存储过程将以ProductsReader的权限上下文执行
EXECUTE AS USER = 'jerry'
SELECT  USER
GO
EXECUTE products.usp_Products

讲师: 牛可

时间:  2006年8月9日 10:00--11:30
          产品: SQL Server
          技术等级:  200

欢迎大家积极参与讨论

课后问题及答案

1.       在SQL Server 2005中,数据库的主密钥可以直接用来加密保护:(AB)

A.       证书的私钥

B.       非对称密钥的私钥

C.      非对称密钥的公钥

D.      服务主密钥

2.       当采用加密技术来保护数据库中的大量敏感数据时,为了兼顾性能和数据的安全性,最佳的做法是:(C)

A.       使用证书加密所有敏感数据,并用对称密钥加密保护证书的私钥

B.       使用非对称密钥的公钥加密所有敏感数据,并用对称密钥加密保护该密钥对的私钥

C.      使用对称密钥加密所有敏感数据,并用证书加密保护该对称密钥

D.      使用非对称密钥的私钥加密所有敏感数据,并用证书加密保护该密钥对的公钥

3.       在SQL Server 2005中使用证书签署存储过程的目的是:(D)

A.       确保只有拥有该证书对应私钥的用户才能执行该存储过程

B.       加密存储过程,防止其它人查看到存储过程中的T-SQL语句

C.      加密存储过程执行返回的数据结果集

D.      让该存储过程以证书所对应的数据库用户的权限执行

SQL SERVER2005加密解密数据相关推荐

  1. 加密解密_使用RSA密钥对加密解密数据

    使用RSA密钥对加密解密数据 作者: 郭政鸿 2021/1/6 前言: 前几天看了非对称加密, 那非对称加密处理常见的https中的应用, 平时我们可以用来做什么呢? 1. 生成RSA密钥对 使用op ...

  2. js脚本锁计算机软件,JS使用插件cryptojs进行加密解密数据实例

    本文实例讲述了JS使用插件cryptojs进行加密解密数据.分享给大家供大家参考,具体如下: Testing websockets var key = 'BOTWAVEE'; //CBC模式加密 fu ...

  3. PHP通过OpenSSL生成证书、密钥并且加密解密数据,以及公钥,私钥和数字签名的理解...

    一.公钥加密 假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥. 我有一个文件,不能让别人看,我就用1加密了.别人找到了这个 ...

  4. 加密解密和怎么造加密解密数据

    1.一般对于一些项目,会对用户的信息进行加密解密后再处理 举个例子:用户名.密码加密后再处理,页面给出的是一堆堆经过加密的数据 用户名和密码加密后:eyJ1aWQiOiIxMTFkNWFmZGRmMz ...

  5. oracle dbms_crypto,Oracle的dbms_obfuscation_toolkit加密解密数据

    oracle从8i开始提供一个数据加密包:dbms_obfuscation_toolkit.利用这个包,我们可以对数据进行DES,Triple DES或者MD5加密. 本文就此讲解如何使用以及使用过程 ...

  6. mysql aes256_pl/sql:aes256加密解密

    调用相应的API对BLOB数据 相应的加密和解密 PL/SQL 加密解密 --加密function encrypt_aes256 (p_blob in blob, p_key in varchar2) ...

  7. 使用node加密解密数据,创建Hash/HMAC,并生成签名与验证签名

    1.数据加密与解密 主要使用了node的crypto模块的Cipher与Decipher类来加密解密,加密与解密的方法主要有以下几种: 1.1 使用Cipher与Decipher对象作为流来加密解密 ...

  8. Golang-RSA加密解密-数据无大小限制(gophp)

    Go 实现工具包(import调用该包即可) package xrsa import ("encoding/pem""encoding/base64"" ...

  9. php 固定长度加密解密,如何加密/解密数据在PHP?

    前言 从您的表定义开始: - UserID - Fname - Lname - Email - Password - IV 这里是更改: >字段Fname,Lname和Email将使用由Open ...

最新文章

  1. 二次开发photoshop_Photoshop 101:Web开发人员简介
  2. Boost:timer计时器测试程序
  3. k8s查看pod的yaml文件_K8S系列学习,Pod实战那些事儿,有必要知道知道
  4. 关于Expdp/Impdp 并行导入导出详细测试结果和并行参数的正确理解!!
  5. 第8章例题 6-4 输入年份和天数,输出对应的年、月、日
  6. Linux 命令之 htop -- 互动的进程查看器/查看进程信息
  7. Spring Boot 配置SSL 实现HTTPS
  8. 这个故事告诉你,拥有吃不胖的超能力就无忧无虑
  9. 某公司R2631E以太口通过SDH接新桥的ATM交换机,出现丢包问题的解决方法
  10. 东大14春学期《计算机应用基础》在线作业1,东大18春学期《计算机应用基础》在线作业...
  11. 查询软件和硬件列表清单[将文章里代码另存为 list.vbs,双击运行就会出现一个html页面]...
  12. php 单词替换,单词替换 - Shiyin's note
  13. FMS直播,在PC和手机PAD同时接收直播(使用RTMP和HLS协议)
  14. android 图片/视频混合轮播控件banner
  15. (转)高盛报告:人工智能、机器学习和数据将推动未来生产力的发展
  16. CLASST T 使用
  17. React SSR 服务器端渲染
  18. postman生成时间戳,未来时间戳
  19. 【特征选择】基于亨利气体溶解度优化算法求解二进制特征选择问题(HGSO)含Matlab源码
  20. 暴风影音官网、App 挂了​!老板被捕,高管全辞职,员工:以后工作向谁汇报?...

热门文章

  1. 源代码安装-非ROOT用户安装软件的方法
  2. C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例
  3. P1631 序列合并
  4. 【转载】cookie
  5. Codeforces Round #276 (Div. 2)
  6. BZOJ2743 [HEOI2012]采花
  7. 好久没写blog了。最近感觉自己老了
  8. dbeaver连接mysql 驱动jar_Jmeter(七) 从入门到精通 建立数据库测试计划实战lt;MySQL数据库gt;(详解教程)...
  9. matlab将图片转换为灰度图_视频处理之灰度图
  10. stl clocklist 查找元素_C++|通俗理解STL