数据库加密

air_line 2008-01-18 08:30:31
最近看了些数据库加密的方式:
通过操作系统对sql server 中数据表进行加密,sql server 内部加密,..
谁有具体例子或资料
...全文
458 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
bean_sql 2011-09-15
  • 打赏
  • 举报
回复
学习...
GooKit 2011-02-12
  • 打赏
  • 举报
回复
xxmsuper 2009-08-14
  • 打赏
  • 举报
回复
mark
air_line 2008-08-18
  • 打赏
  • 举报
回复
谢谢楼上各位帮助!
中国风 2008-01-19
  • 打赏
  • 举报
回复
開啟對稱金鑰也可用函数:
CREATE FUNCTION dbo.udfDecryptData ( @InputValue VARBINARY(256))
RETURNS NVARCHAR(20)
WITH EXECUTE AS 'DBO'
AS
BEGIN
RETURN convert( NVARCHAR(50), decryptbykeyautocert( cert_id( 'SalaryCert' ),null, @InputValue ))
END

go
GRANT EXECUTE ON [dbo].[udfDecryptData] TO 用户名
go

SELECT
employee,
dbo.udfDecryptData( salary )
FROM Salary
liangCK 2008-01-19
  • 打赏
  • 举报
回复
OracleRoob 2008-01-19
  • 打赏
  • 举报
回复
对原始数据加密,查询时比较困难,还要考虑效率问题。
xiaoku 2008-01-19
  • 打赏
  • 举报
回复
顶上.
中国风 2008-01-19
  • 打赏
  • 举报
回复
测试例子: 

use test
go
create login Login_roy with password='roy888'--創建登陸名
go
create user User_roy for login Login_roy --創建用戶名

create master key encryption by password='pass123456' --建立資料庫主要金鑰
go
create table Salary(
employee nvarchar(50),
salary varbinary(100)
)
go
grant select,insert to User_roy --授於roy用戶select\insert權限
go
create symmetric key Salary_user_key --建立對稱金鑰
authorization User_roy WITH algorithm= triple_des
encryption by password='roy666'
go
execute as login='Login_roy'--切換登入賬號
go

open symmetric key Salary_user_key decryption by password='roy666'--開啟對稱金鑰

go
select * from sys.openkeys--查詢結果,沒開啟時不會有結果
go
--以下操作表數據
--1新增
insert Salary values(N'程序員A',encryptbykey(Key_GUID('Salary_user_key'),'8000'))
insert Salary values(N'程序員B',encryptbykey(Key_GUID('Salary_user_key'),'10000'))
go

close all symmetric keys--關閉所有金鑰

go
select * from Salary
/*
employee salary
-------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
程序員A 0x0008BCED7496E247903671B6691E76BE01000000E2A581890D0CD44F17D9FD577F5B4F429538FFED339CE21F
程序員B 0x0008BCED7496E247903671B6691E76BE01000000F4F3204491C2114BDE26B09695B87A2CDC90D1002708FDD0

(2 個資料列受到影響)

*/
go
open symmetric key Salary_user_key decryption by password='roy666'--開啟對稱金鑰
go
SELECT
employee,
CONVERT(varchar,decryptByKey(salary))
FROM Salary
/*
employee
-------------------------------------------------- ------------------------------
程序員A 8000
程序員B 10000

(2 個資料列受到影響)

*/
go
insert Salary values(N'程序員C',encryptbykey(Key_GUID('Salary_user_key'),'12000'))
go
close all symmetric keys--關閉所有金鑰
go
SELECT
employee,
CONVERT(varchar,decryptByKey(salary))
FROM Salary
/*
employee
-------------------------------------------------- ------------------------------
程序員A NULL
程序員B NULL
程序員C NULL

(3 個資料列受到影響)

*/

revert; --切換回最後一個 EXECUTE AS 陳述式的登陸者

go
--用憑證方式....
create certificate SalaryCert --將憑證加入至資料庫中
authorization User_roy
with subject='Certificate person',
expiry_date = '12/31/3000'--到期日期
go

open symmetric key Salary_user_key decryption by password='roy666'--開啟對稱金鑰
go
--密碼新增加密,然後由憑證移除加密

alter symmetric key Salary_user_key add encryption by certificate SalaryCert

go
alter symmetric key Salary_user_key drop encryption by password= 'roy666'--移除加密
GO
close all symmetric keys
go
execute as login='Login_roy'--切換登入賬號

go
open symmetric key Salary_user_key decryption by certificate SalaryCert
go
SELECT
employee,
CONVERT(varchar,decryptByKey(salary))
FROM Salary

/*
employee
-------------------------------------------------- ------------------------------
程序員A 8000
程序員B 10000
程序員C 12000

(3 個資料列受到影響)
*/
go
close all symmetric keys --關閉
go
SELECT
employee,
CONVERT(varchar,decryptByKey(salary))
FROM Salary

go
/*
employee
-------------------------------------------------- ------------------------------
程序員A NULL
程序員B NULL
程序員C NULL

(3 個資料列受到影響)
*/

--drop symmetric key Salary_user_key--禁用
--drop certificate SalaryCert--禁用

go
SELECT
employee,
CONVERT(varchar,decryptByKey(salary))
FROM Salary


--truncate table Salary

free1879 2008-01-19
  • 打赏
  • 举报
回复
好长 来学习的!
w2jc 2008-01-18
  • 打赏
  • 举报
回复
2005里面支持内部的数据加密,可以使用对称的,或者非对称的密码。
支持3个级别的加密:数据库服务器级,数据库级,数据记录级

对称密码就是一般的加密口令,
非对称加密这是使用安全证书。

下面的一些命令是你可能会用到的:

服务器级别的加密
backup service master key (SQL 2005 会自动生成一个对称密码,如果你要使用数据库服务器级的加密,必须首先备份这个密码,以便今后恢复数据库时使用)
restore service master key

数据库级别的加密
create master key encryption by password ... (这是创建数据库级的密码)

数据记录级的加密
create symmetric key ... (创建对称加密的密码)
create asymmetric key ... (使用证书创建非对称加密的密码)
create certificate ... (自己创建证书)

在联机文档里面看一下这些命令,会知道一些细节。

下面是MSSQL 2005加密体系的总体构架
SQL Server 2005 Books Online (September 2007)
Encryption Hierarchy
http://msdn2.microsoft.com/en-us/library/ms189586.aspx
dawugui 2008-01-18
  • 打赏
  • 举报
回复
SQL Server安全-加密术和SQL注入攻击

SQL Server上的加密术

SQL Server上内置了加密术用来保护各种类型的敏感数据。在很多时候,这个加密术对于你来说是完全透明的;当数据被存储时候被加密,它们被使用的时候就会自动加密。在其他的情况下,你可以选择数据是否要被加密。SQL Server可以加密下列这些组件:

·密码

·存储过程,视图,触发器,用户自定义函数,默认值,和规则。

·在服务器和用户之间传输的数据

密码加密术
SQL Server自动将你分配给登陆和应用角色的密码加密。尽管当你可以从主数据库中直接察看系统表格而不需要密码。你不能给对这种情况作出任何修改,事实上,你根本不能破坏它。

定义加密术
在有些时候,如果对对象进行加密是防止将一些信息分享给他人。例如,一个存储进程可能包含所有者的商业信息,但是这个信息不能和让其他的人看到,即使他们公开的系统表格并可以看到对象的定义。这就是为什么SQL Server允许你在创建一个对象的时候进行加密。为了加密一个存储进程,使用下面形式的CREAT PROCEDURE 语句:

CREATE PROCEDURE procedurename [;number]

[@parameter datatype

[VARYING][ = defaultvalue][OUTPUT]]

[, …]

[WITH RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION]

我们关心的仅仅是可选的WITH参数。你可以详细说明ARECOMPILE或者ENCRYPTION,或者你可以同时说明它们。ENCRYPTION关键字保护SQL Server它不被公开在进程中。结果,如果ENCRYPTION在激活的时候系统存储进程sp_helptext就会被忽视,这个存储进程将被存储在用户创建进程的文本中。如果你不想要加密,你可以使用ALTER PROCEDURE,忽略WITH ENCRYPTION子句来重新创建一个进程。

为了能够使用加密术。用户和服务器都应该使用TCP/IP NetworkLibraries用来连接。运行适当的Network Utility和检查Force protocol encryption,看下表,用户和服务器之间的连接将不会被加密。



加密也不能完全自由。当连接确定后,要继续其他的构造,并且用户和服务器必须运行代码来解释加密和解释的包裹。这里将需要一些开销并且当在编译码的时候会使进程慢下来。如果网络包裹在你控制范围之外,使用这种做法是非常好的。
加密术中缺少什么?
你可以注意到在这个列表中缺少一些被加密的东西:你表格中的数据。在你存储数据之前,SQL Server不会提供任何内置的工具来加密你的数据。如果你需要保护存储在SQL Server上的数据,我们给你两条建议:第一,你可以利用GRANT 和DENY关键字来控制你想哪个用户可以在SQL Server中读取的数据。

第二.如果你真的想对数据加密,不要设法加密码。你可以利用被测试过的商业产品的算法。

SQL 注入攻击
SQL 注入攻击是一个常规性的攻击,它可以允许一些不法用户检索你的数据,改变服务器的设置,或者在你不小心的时候黑掉你的服务器。SQL 注入攻击不是SQL Server问题,而是不适当的程序。如果你想要运行这些程序的话,你必须明白这冒着一定的风险。

测点定位弱点
SQL 注入的脆弱点发生在程序开发员构造一个WHERE 子句伴随着用户的输入的时候。比如,一个简单的ASP程序允许用户输入一个顾客的ID然后检索公司的全部人员的名字,如果顾客ID如果作为ASP页面的请求串的一部分返回,那么开发员可以编写下面的代码获得数据:

strConn = "Provider=SQLOLEDB;Data Source=(local);" & _

"Database=Northwind;Integrated Security=SSPI"

Set cnn = Server.CreateObject("ADODB.Connection")

cnn.Open strConn

strQuery = "SELECT ContactName FROM Customers " & _

“WHERE CustomerID = '" & Request.Form("CustID") & "'"

Set rstResults = cnn.Execute(strQuery)

Response.Write(rstResults.Fields("ContactName").Value)

现在你知道什么地方有问题了吧?如果用户知道一个用户的ID,他可以通过检索来获得全部的相应的名字。现在明白了?

获得额外的数据
当然,对于一个攻击程序,尽管它不知道任何顾客的ID,甚至不用去猜,它也可以获得数据。为了完成这个工作,它将下面的文本输入到应用程序调用顾客ID的textbox中:

customer ID:

'UNION ALL SELECT ContactName FROM Customers

WHERE CustomerID <>'

如果你输入了这个代码,你将会看到返回一个询问语句:

SELECT ContactName FROM Customers

WHERE CustomerID = ''

UNION ALL SELECT ContactName FROM Customers

WHERE CustomerID <>''

通过获得空和非空顾客的ID并集,这个查询语句会返回数据库中所有的相关姓名。事实上,这个UNION技术可以被用来获得你数据库中大多数信息,看看这个CustomerID的值:

'UNION ALL SELECT FirstName + ' ' + LastName FROM

Employees WHERE LastName <>'

它将SQL语句变成:

SELECT ContactName FROM Customers

WHERE CustomerID = ''

UNION ALL SELECT FirstName + ' ' + LastName FROM

Employees WHERE LastName <>''

看,那就是攻击程序从你的数据库获得的第一个雇员的名字。

更多的攻击程序
如果SQL注入仅仅只有数据暴光这个弱点就已经够糟糕的了,但是,实际上一个良好的攻击程序可以通过这个弱点获取你数据库中所有的资料。看下面这个例子:

';DROP TABLE Customers;--

SQL语句变成:

SELECT ContactName FROM Customers

WHERE CustomerID = ''

; DROP TABLE Customers;-- '

这个分号使语句和SQL Server隔离,所以,这里实际上是两个语句。第一个语句不存在的名字,第二个则撤消的整个Customers表。两个—SQL Server注释符,它可以使子句不发生语法错误。

使用这个技术的变异,一个攻击程序可以在任何SQL语句或者存储过程上运行。通过使用xp_cmdshell扩展存储过程,一个攻击程序同样可以在操作系统命令下运行,显然,这是一个严重的漏洞。

保护自己的数据库
现在,你知道如何防范SQL注入攻击了吗?首先,你不能在用户输入中构造WHERE子句,你应该利用参数来使用存储进程。在最初的ASP页面下,重新写的部分将和刚才我们在表中所看到的东西相似。即使你认为在你的应用程序中没有脆弱点,你应该遵守最小特权原则。使用我们建议的其他安全技术允许你的用户仅仅访问他们能够访问的。在你没有发现你数据库脆弱点的时候,只有这样,不会使你的数据库崩溃。

最后的建议
这就是全部的SQL Server安全系列。也许你现在不是一个全面的专家,但是你已经了解了很多反面。下一步就是你要保护你SQL Server数据,记住你在这里所学到的知识,并利用到你的数据库中保证你的数据不被那些黑客攻击。

dawugui 2008-01-18
  • 打赏
  • 举报
回复
SQL Server 2005数据加密技术应用研究
ZDNet 软件频道 更新时间:2007-09-12作者:lynn 来源:赛迪网技术社区

数据加密是SQL Server 2005新增的数据安全特性,这对应用程序开发者来说是非常重要的改进。本文从程序开发者角度,探讨SQL Server 2005数据加密特性以及如何运用该特性保证系统的数据安全。


关键词 SQL Server 2005、数据加密、数据安全


SQL Server 2005是微软开始实施其“可信赖计算” 计划以来的第一个主要的产品,它提供了丰富的安全特性,为企业数据提供安全保障。对开发人员来说,最关注的是如何在程序设计过程中应用这些特性来保护数据库中的数据安全。本文将从应用程序开发者角度探讨基于SQL Server 2005数据加密特性的应用。


SQL Server 2005数据加密技术


数据用数字方式存储在服务器中并非万无一失。实践证明有太多的方法可以智取SQL Server 2000认证保护,最简单的是通过使用没有口令的sa账号。尽管SQL Server 2005远比它以前的版本安全,但攻击者还是有可能获得存储的数据。因此,数据加密成为更彻底的数据保护战略,即使攻击者得以存取数据,还不得不解密,因而对数据增加了一层保护。


SQL Server 2000以前的版本没有内置数据加密功能,若要在SQL Server 2000中进行数据加密,不得不买第三家产品,然后在服务器外部作COM调用或者是在数据送服务器之前在客户端的应用中执行加密。这意味着加密的密钥或证书不得不由加密者自己负责保护,而保护密钥是数据加密中最难的事,所以即使很多应用中数据已被很强的加密过,数据保护仍然很弱。


SQL Server 2005通过将数据加密作为数据库的内在特性解决了这个问题。它除了提供多层次的密钥和丰富的加密算法外,最大的好处是用户可以选择数据服务器管理密钥。SQL Server 2005服务器支持的加密算法如下:


⑴ 对称式加密(Symmetric Key Encryption):


对称式加密方式对加密和解密使用相同的密钥。通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。但当数据储存在SQL Server中时,这种方式很理想,你可以让服务器管理它。SQL Server 2005 提供RC4、RC2、DES 和 AES 系列加密算法。


⑵ 非对称密钥加密(Asymmetric Key Encryption):


非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。公共密钥可以广泛的共享和透露。当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。SQL Server 2005 支持 RSA 加密算法以及 512 位、1,024 位和 2,048 位的密钥强度。

⑶ 数字证书(Certificate):


数字证书是一种非对称密钥加密,但是,一个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。SQL Server 2005 支持“因特网工程工作组”(IETF) X.509 版本 3 (X.509v3) 规范。一个组织可以对 SQL Server 2005 使用外部生成的证书,或者可以使用 SQL Server 2005 生成证书。


SQL Server 2005 采用多级密钥来保护它内部的密钥和数据,如下图所示:


图中引出箭头的密钥或服务用于保护箭头所指的密钥。所以服务主密钥(service master key)保护数据库主密钥(database master keys),而数据库主密钥又保护证书(certificates)和非对称密钥(asymmetric keys)。而最底层的对称性密钥(symmetric keys)被证书、非对称密钥或其他的对称性密钥保护(箭头又指回它本身)。用户只需通过提供密码来保护这一系列的密钥。

  图中顶层的服务主密钥,安装SQL Server 2005新实例时自动产生和安装,用户不能删除此密钥,但数据库管理员能对它进行基本的维护,如备份该密钥到一个加密文件,当其危及到安全时更新它,恢复它。

服务主密钥由DPAPI(Data Protection API)管理。DPAPI在Windows 2000 中引入,建立于Windows的Crypt32 API之上。SQL Server 2005 管理与DPAPI的接口。服务主密钥本身是对称式加密,用来加密服务器中的数据库主密钥。

  数据库主密钥与服务主密钥不同,在加密数据库中数据之前,必须由数据库管理员创建数据库主密钥。通常管理员在产生该密钥时,提供一个口令,所以它用口令和服务主密钥来加密。如果有足够的权限,用户可以在需要时显式地或自动地打开该密钥。下面是产生数据库主密钥的T-SQL代码示例:

USE EncryptionDB

CREATE MASTER KEY

ENCRYPTION BY PASSWORD = 'UTY6%djzZ8S7RyL'

每个数据库只有一个数据库主密钥。可以用ALTER MASTR KEY语句来删除加密,更改口令或删除数据库主密钥。通常这由数据库管理员来负责做这些。

有了数据库主密钥,就可以着手加密数据。T-SQL有置于其内的加密支持。使用CREATE语句创建各种密码,ALTER语句修改他们。例如要创建对称式加密,可以通过一对函数EncryptByKey 和 DecryptByKey来完成。

数据加密技术应用解析

下面通过实例来探讨SQL Server 2005数据加密与解密技术的实现。

假设有一张Customer 表,表中有字段 customer ID、 name、 city 和各种信用卡细节。其中信用卡细节需要加密而其他数据不需要。假设User1有对称式密钥,并用该密钥登录,运行相应的代码加密数据。

⑴ 数据加密

① 产生密钥:在含有Customers 表的数据库中使用Triple DES作为加密算法,生成对称式密钥。本例中,密钥本身由已经存在在数据库中的证书保护,如图一所示,对称密码受非对称密码和存在的其他对称式密钥保护。

CREATE SYMMETRIC KEY User1SymmetricKeyCert

AUTHORIZATION User1

WITH ALGORITHM = TRIPLE_DES

ENCRYPTION BY CERTIFICATE User1Certificate

② 打开密钥:对称式密钥使用前必须显式打开,所以接下来打开它,重新找回密码,解密它,并放它在受保护的服务器内存中,准备使用。

OPEN SYMMETRIC KEY User1SymmetricKeyCert

DECRYPTION BY CERTIFICATE User1Certificate

③ 加密数据:在下面的代码中,使用正常的T-SQL INSERT语句将一行数据插入表中,id、name和city 用明文保存,信用卡类型、号码以及有潜在机密的客户注释用加密方式储存,用Triple DES加密算法加密数据。

INSERT INTO Customer

VALUES (4, 'John Doe', 'Fairbanks',

EncryptByKey(Key_GUID(

'User1SymmetricKeyCert'), 'Amex'),

EncryptByKey(Key_GUID(

'User1SymmetricKeyCert'),

'1234-5678-9009-8765'),

EncryptByKey(Key_GUID(

'User1SymmetricKeyCert'),

'Window shopper. Spends at most.'))

加密完成后,关闭它,释放内存,以防它被误用。

CLOSE SYMMETRIC KEY User1SymmetricKeyCert

以上是整个的数据加密的操作过程。它没有混乱的密码管理,也不用调用特别的算法。储存加密数据的字段是varbinary类型数据,其长度足以储存扩展的数据(加密数据比明文需要更多的空间,有时候多很多)。

⑵ 数据解密

要解密已加密的数据,你需要重新打开对称式加密。使用DecryptByKey函数读数据,然后关闭对称式加密。结果及相应的代码如下。

OPEN SYMMETRIC KEY User1SymmetricKeyCert

DECRYPTION BY CERTIFICATE User1Certificate

SELECT CustID, Name, City,

CONVERT(VARCHAR, DecryptByKey(CreditCardType))

AS CardType,

CONVERT(VARCHAR, DecryptByKey(CreditCardNumber))

AS CardNumber,

CONVERT(VARCHAR, DecryptByKey(Notes))

AS Notes

FROM Customer WHERE CustID = 4

CLOSE SYMMETRICKEYUser1SymmetricKeyCert

这个例子显示了让SQL Server 2005为你管理密钥的一种方法。但实际上,用户总是选择自己提供一个口令的方式,用RC4算法产生对称密码。代码如下:

CREATE SYMMETRIC KEY User2SymmetricKeyPwd

AUTHORIZATION User2

WITH ALGORITHM = RC4

ENCRYPTION BY PASSWORD = 'sdylvxF&imeG3FP'

SQL Server 2005产生一个基于用户提供的口令的密钥来加密数据。除非明确指定,否则口令不保存在SQL Server 2005中,用户必须保护好自己的口令,否则任何一个知道口令的人都可以解密数据。

如果认为对存储在数据库中的数据加密完全是浪费处理器时间和存储空间那就错了。SQL Server 2005中的数据加密是一个非凡的特性,它为客户的数据提供了一个重要的保护层。但应用时要注意,只对那些敏感机密的数据进行保护,因为加密消耗服务器处理器大量的资源,如果对一个有一千万条记录的表的每个字段都加密的话,运行一条没有Where 子句的SELECT 就可能导致服务器性能的崩溃。(



changjiangzhibin 2008-01-18
  • 打赏
  • 举报
回复
sign
shuisjshuisj 2008-01-18
  • 打赏
  • 举报
回复
顶住,好好学习!!!
liangCK 2008-01-18
  • 打赏
  • 举报
回复
在的..你想散分给我?.呵呵.
dobear_0922 2008-01-18
  • 打赏
  • 举报
回复
小梁还在呀,呵呵
liangCK 2008-01-18
  • 打赏
  • 举报
回复
关注,帮顶.
dobear_0922 2008-01-18
  • 打赏
  • 举报
回复

34,870

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧