sql server 加密_列级SQL Server加密

2023-10-26

--//列加密

--创建一个新的数据库并创建CustomerInfo表

CREATE DATABASE CustomerData;

Go

USE CustomerData;

GO

CREATE TABLE CustomerData.dbo.CustomerInfo

(CustID INT PRIMARY KEY,

CustName VARCHAR(30) NOT NULL,

BankACCNumber VARCHAR(10) NOT NULL

);

GO

--将样本数据插入CustomerInfo表

Insert into CustomerData.dbo.CustomerInfo (CustID,CustName,BankACCNumber)

Select 1,'Rajendra',11111111 UNION ALL

Select 2, 'Manoj',22222222 UNION ALL

Select 3, 'Shyam',33333333 UNION ALL

Select 4,'Akshita',44444444 UNION ALL

Select 5, 'Kashish',55555555

--查看CustomerInfo表中的记录

SELECT * FROM CustomerInfo

/*

我们使用以下步骤进行列级加密:

Create a database master key

创建数据库主密钥

Create a self-signed certificate for SQL Server

为SQL Server创建自签名证书

Configure a symmetric key for encryption

配置对称密钥进行加密

Encrypt the column data

加密列数据

Query and verify the encryption

查询并验证加密

*/

---1:创建用于列级SQL Server加密的数据库主密钥 (Create a database master key for column level SQL Server encryption)

--我们使用CREATE MASTER KEY语句创建数据库主密钥:

USE CustomerData;

GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '#sql6819118';

---我们可以使用sys.symmetric_keys目录视图来验证此数据库主密钥在SQL Server加密中是否存在:

SELECT name KeyName,

symmetric_key_id KeyID,

key_length KeyLength,

algorithm_desc KeyAlgorithm

FROM sys.symmetric_keys;

--在输出中,我们可以注意到它使用密钥算法AES_256创建了一个## MS_DatabaseMasterKey ## 。 SQL Server自动选择以下密钥算法和密钥长度:

--2:创建用于列级SQL Server加密的自签名证书 (Create a self-signed certificate for Column level SQL Server encryption )

--在此步骤中,我们使用CREATE CERTIFICATE语句创建一个自签名证书。 您可能已经看到组织从证书颁发机构收到证书,并将其合并到其基础结构中。 在SQL Server中,我们可以使用自签名证书而不使用证书颁发机构证书。

-----执行以下查询以创建证书:

USE CustomerData;

GO

CREATE CERTIFICATE Certificate_test WITH SUBJECT = 'Protect my data';

GO

---我们可以使用目录视图sys.certificates验证证书:

SELECT name CertName,

certificate_id CertID,

pvt_key_encryption_type_desc EncryptType,

issuer_name Issuer

FROM sys.certificates;

/*

在输出中,我们可以注意以下字段:

Encrypt Type: 加密类型:在此列中,我们获得一个值

ENCRYPTED_BY_MASTER_KEY, 它表明SQL Server使用上一步中创建的数据库主密钥并保护此证书。

CertName:这是我们在CREATE CERTIFICATE语句中定义的证书名称

Issuer: 发行者 :我们没有证书颁发机构的证书; 因此,它显示了我们在CREATE CERTIFICATE语句中定义的主题值

(可选)我们可以在CREATE CERTIFICATE中使用ENCRYPTION BY PASSWORD和EXPIRY_DATE参数; 但是,我们将在本文中跳过它。

*/

--3:为列级SQL Server加密配置对称密钥 (Configure a symmetric key for column level SQL Server encryption)

--在此步骤中,我们将定义一个对称密钥,您也可以在加密层次结构中看到该对称密钥。 对称密钥也使用单个密钥进行加密和解密。 在上面共享的图像中,我们可以看到数据顶部的对称密钥。 建议使用对称密钥进行数据加密,因为我们会获得出色的性能。 对于列加密,我们使用多级方法,它提供了对称密钥的性能和非对称密钥的安全性的好处。

--我们使用以下参数为其使用CREATE SYMMETRIC KEY语句:

--ALGORITHM: AES_256 算法: AES_256

--ENCRYPTION BY CERTIFICATE:应与我们之前使用CREATE CERTIFICATE语句指定的证书名称相同

CREATE SYMMETRIC KEY SymKey_test WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE Certificate_test;

--一旦创建了对称密钥,就可以使用目录视图为列级SQL Server加密检查现有密钥,如前所述:

SELECT name KeyName,

symmetric_key_id KeyID,

key_length KeyLength,

algorithm_desc KeyAlgorithm

FROM sys.symmetric_keys;

--我们可以看到两个密钥条目,因为它既包含数据库主密钥又包含对称密钥:

--//数据加密 (Data encryption)//

--SQL Server加密列数据类型应为VARBINARY 。 在我们的CustomerData表中, BankACCNumber列的数据类型为Varchar(10)。 让我们使用下面指定的ALTER TABLE语句添加一个新的VARBINARY(max)数据类型的列:

ALTER TABLE CustomerData.dbo.CustomerInfo

ADD BankACCNumber_encrypt varbinary(MAX)

--让我们加密此新添加的列中的数据。

--在查询窗口中,打开对称密钥并使用证书解密。 我们需要使用与先前创建的相同的对称密钥和证书名称

OPEN SYMMETRIC KEY SymKey_test

DECRYPTION BY CERTIFICATE Certificate_test;

--在同一会话中,使用以下UPDATE语句。 它使用EncryptByKey函数并使用对称函数对BankACCNumber列进行加密,并更新新创建的BankACCNumber_encrypt列中的值

UPDATE CustomerData.dbo.CustomerInfo

SET BankACCNumber_encrypt = EncryptByKey (Key_GUID('SymKey_test'), BankACCNumber)

FROM CustomerData.dbo.CustomerInfo;

GO

--使用CLOSE SYMMETRIC KEY语句关闭对称密钥 。 如果我们不关闭密钥,它将保持打开状态,直到会话终止

CLOSE SYMMETRIC KEY SymKey_test;

GO

--我们可以在新添加的列中看到加密的记录。 如果用户也有权访问此表,则他不解密就无法理解数据:

SELECT * FROM CustomerInfo

go

--让我们也删除旧列:

ALTER TABLE CustomerData.dbo.CustomerInfo DROP COLUMN BankACCNumber;

GO

SELECT * FROM CustomerInfo

--//至此,列加密完毕//

-----------------

--//解密列级SQL Server加密数据 (Decrypt column level SQL Server encryption data)

--我们需要执行以下命令来解密列级加密数据:

--在查询窗口中,打开对称密钥并使用证书解密。 我们需要使用与先前创建的相同的对称密钥和证书名称

OPEN SYMMETRIC KEY SymKey_test

DECRYPTION BY CERTIFICATE Certificate_test;

--使用SELECT语句并使用DecryptByKey()函数解密加密的数据

SELECT CustID, CustName,BankACCNumber_encrypt AS 'Encrypted data',

CONVERT(varchar, DecryptByKey(BankACCNumber_encrypt)) AS 'Decrypted Bank account number'

FROM CustomerData.dbo.CustomerInfo;

--解密数据所需的权限 (Permissions required for decrypting data)

--具有读取权限的用户无法使用对称密钥解密数据。 让我们模拟这个问题。 为此,我们将创建一个用户并在CustomerData数据库上提供db_datareader权限:

USE [master]

GO

CREATE LOGIN [SQLShack] WITH PASSWORD=N'sqlshack', DEFAULT_DATABASE=[CustomerData], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

GO

USE [CustomerData]

GO

CREATE USER [SQLShack] FOR LOGIN [SQLShack]

GO

USE [CustomerData]

GO

ALTER ROLE [db_datareader] ADD MEMBER [SQLShack]

GO

--现在,使用SQLShack用户连接到SSMS并执行查询以解密BankACCNumber_encrypt列以选择记录:

OPEN SYMMETRIC KEY SymKey_test

DECRYPTION BY CERTIFICATE Certificate_test;

SELECT CustID, CustName,BankACCNumber_encrypt AS 'Encrypted data',

CONVERT(varchar, DecryptByKey(BankACCNumber_encrypt)) AS 'Decrypted Bank account number'

FROM CustomerData.dbo.CustomerInfo;

---在输出消息中,我们得到以下消息:对称密钥不存在,或者用户没有使用对称密钥的权限:

----我们可以提供对对称密钥和证书的权限:

--Symmetric key permission: GRANT VIEW DEFINITION 对称密钥许可 :GRANT VIEW DEFINITION

--Certificate permission: GRANT VIEW DEFINITION and GRANT CONTROL permissions 证书权限: GRANT VIEW DEFINITION和GRANT CONTROL权限

--Execute these scripts with from a user account with admin privileges:

---使用具有管理员特权的用户帐户执行以下脚本:

GRANT VIEW DEFINITION ON SYMMETRIC KEY::SymKey_test TO SQLShack;

GO

GRANT VIEW DEFINITION ON Certificate::[Certificate_test] TO SQLShack;

GO

GRANT CONTROL ON Certificate::[Certificate_test] TO SQLShack;

--

OPEN SYMMETRIC KEY SymKey_test

DECRYPTION BY CERTIFICATE Certificate_test;

SELECT CustID, CustName,BankACCNumber_encrypt AS 'Encrypted data',

CONVERT(varchar, DecryptByKey(BankACCNumber_encrypt)) AS 'Decrypted Bank account number'

FROM CustomerData.dbo.CustomerInfo;

--此时SQLShack有了解密权限

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sql server 加密_列级SQL Server加密 的相关文章

随机推荐

  • FISCO BCOS节点扩容和使用console进行群组扩容

    一 安装并启动FISCO BCOS 搭建单机单群组4节点的教程查看 https blog csdn net yueyue763184 article details 128924144 spm 1001 2014 3001 5501 二 下
  • 最小优先级队列 — 使用最小堆实现

    最小优先级支持的操作 1 INSERT S x 将元素x插入队列S 2 MINIMUM S 返回S中最小的元素 3 EXTRACT MIN S 去掉并返回S中最小的元素 4 DECREASE KEY S x key 将下标为x的元素值降低为
  • 获得代理ippython_python爬虫之抓取代理服务器IP

    前言 使用爬虫爬取网站的信息常常会遇到的问题是 你的爬虫行为被对方识别了 对方把你的IP屏蔽了 返回不了正常的数据给你 那么这时候就需要使用代理服务器IP来伪装你的请求了 免费代理服务器网站有 下面我们以西刺免费代理IP为例子看看是如何获取
  • ArcGISMapsSDK for UnrealEngine_AQ

    ArcGISMapsSDK for UnrealEngine AQ Prepare 1 ArcGIS Maps SDK for game engines 2 ArcGIS Maps SDK for Unreal Engine Beta 2
  • jQuery 的 DOM 操作- 中

    文章目录 jQuery 的 DOM 操作 中 复制节点 复制节点介绍 复制节点 应用实例 替换节点 替换节点介绍 替换节点 应用实例 属性操作 样式操作 样式操作介绍 应用实例 jQuery 的 DOM 操作 中 注意本篇和jQuery 的
  • 【java】常用到的一些获取文件内容的方法

    一 前奏准备 获取文件名 根据文件名获取路径 文件路径名 String path public String getPath return path 根据路径获取文件名 return 文件名字符串 public String fileNam
  • Cocos 2dx iOS 平台初始化,OpenGL 初始化,分辨率设置

    Cocos 2dx iOS 平台初始化 OpenGL 初始化 分辨率设置 1 Main m int retVal UIApplicationMain argc argv nil AppController AppController mm
  • 判断操作系统和浏览器类型(苹果还是安卓,微信还是QQ)

    一 获取操作系统类型 function getOS var userAgent navigator in window userAgent in navigator navigator userAgent toLowerCase var v
  • FPGA时序约束学习笔记——IO约束(转)

    一 参考模型 图源来自 抢先版 小梅哥FPGA时序约束从遥望到领悟 二 参数分析 T 0 gt 3 Tclk1 T 3 gt 4 Tco T 4 gt 5 T 5 gt 6 Tdata T 4 gt 5 Tdata Init T 5 gt
  • 渗透测试流程

    文章目录 前言 一 渗透测试流程 二 流程步骤 1 明确目标 2 信息收集 3 漏洞探测 4 漏洞验证 5 提权所需 6 信息分析 7 信息整理 8 形成报告 总结 前言 渗透测试 出于保护信息系统的目的 更全面地找出测试对象的安全隐患 入
  • python数据库连接

    python数据库连接 import os import time import pymysql import sys class Myclass object def init self try self db pymysql conne
  • Springboot整合Activiti详解

    文章目录 版本依赖 配置文件 需要注意的问题 画流程图 activiti服务类进行编写 流程部署 流程定义 启动流程 流程实例 测试流程 启动流程 完成任务 受理任务 版本依赖 开发工具 IDEA SpringBoot 2 4 5 这里我试
  • MySQL

    1 MySQL概述 1 什么是数据库 数据库是一个存储数据的仓库 2 都有哪些公司在用数据库 金融机构 游戏网站 购物网站 论坛网站 3 提供数据库服务的软件 1 软件分类 MySQL SQL Server Oracle Mariadb D
  • 初中计算机试题戏曲进校园,【校园通讯】“戏曲进校园”走进东街学校,春风化新雨,戏曲百媚生!...

    原标题 校园通讯 戏曲进校园 走进东街学校 春风化新雨 戏曲百媚生 戏曲进校园 戏曲进校园 走进东街学校 春风化新雨 戏曲百媚生 文 东街学校 张永慰 弘扬民族文化 展现戏曲精华 10月10日 戏曲进校园 活动走进济水东街学校 为全体师生带
  • 3.18飞书面试(58min)

    3 18飞书面试 58min 1 问项目 首先是问redis是怎么用的 mq的消费是怎么写的呢 mq如何保证消息消费的可靠性 你在项目中用到了本地缓存 放在了业务代码内存中 那如果签到一半你的项目突然崩了 本地缓存都消失了 那不是会出问题啊
  • [人工智能-深度学习-66]:架构 - 人工智能的学习误区与正确思路、方法

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122116482 目录 前言 第1章
  • spring+struts+ibatis

    原来的系统里面只采用了struts的框架 并且没有使用struts的校验功能 为方便开发 修改框架为spring struts ibatis组合1 添加需要的jar文件2 添加spring配置文件applicationContext xml
  • view-source是一种协议,查看源码

    view source是一种协议 早期基本上每个浏览器都支持这个协议 后来Microsoft考虑安全性 对于WindowsXP pack2以及更高版本以后IE就不再支持此协议 但是这个方法在FireFox和Chrome浏览器都还可以使用 如
  • Linux驱动_spi驱动(ICM20608)

    参考 Linux SPI 驱动分析 1 结构框架 StephenZhou CSDN博客 linux spi驱动 Linux SPI 驱动分析 2 框架层源码分析 StephenZhou CSDN博客 spi message init SPI
  • sql server 加密_列级SQL Server加密

    列加密 创建一个新的数据库并创建CustomerInfo表 CREATE DATABASE CustomerData Go USE CustomerData GO CREATE TABLE CustomerData dbo Customer