没有合适的资源?快使用搜索试试~ 我知道了~
首页SQLServer中数据加密方法
SQLServer中数据加密方法

对SQLServer中的数据进行加密,有三种方法, 1、 在程序语言中先对数据进行加密后再把加密后的数据保存在SQLServer数据库中; 2、 利用SQLServer未公开的加密密码函数,在SQL代码中调用加密密码函数对数据进行加密后保存; 3、 编写扩展存储过程的外部DLL文件实现加密,然后由SQL代码调用加密功能实现数据加密。
资源详情
资源评论
资源推荐

SQLServer 中数据加密方法
对 SQLServer 中的数据进行加密,有三种方法,
1、 在程序语言中先对数据进行加密后再把加密后的数据保存在 SQLServer 数据库中;
2、 利用 SQLServer 未公开的加密密码函数,在 SQL 代码中调用加密密码函数对数据进行
加密后保存;
3、 编写扩展存储过程的外部 DLL 文件实现加密,然后由 SQL 代码调用加密功能实现数
据加密。
第一种方法就不再描述,利用第二种方法加密数据代码示例:
create table #temptable(iorder int, pswd varbinary(1024) )
go
insert into #temptable values(1, pwdencrypt('yang'))
insert into #temptable values(2, pwdencrypt('lian'))
insert into #temptable values(3, pwdencrypt('shan'))
go
select * from #temptable
go
-- 比较数据是否相等
select * from #temptable
where pwdcompare('lian', pswd)=1
go
drop table #temptable
go

上面的语句中,用到了二个函数:pwdencrypt 和 pwdcompare,这是二个 SQLServer 未公开
的 函 数 , pwdencrypt 实 现 对 输 入 数 据 进 行 加 密 后 返 回 二 进 制 形 式 的 加 密 内 容 , 而
pwdcompare 用于检查明文是否与加密的二进制数据内容相等,没有解密函数。这二个函数
主要是用于 SQLServer 内部自己调用。优点是调用方便,缺点是这二个函数没有公开,就
意味着可能改变,并且不兼容原来的,在使用上存在风险。
第三种方法,在我的上一篇文章《在 SQLServer 中调用外部扩展存储过程》里,已描述了
怎样编写扩展存储过程 DLL 文件和怎样注册扩展存储过程,我提供了一个完整的加密 DLL
文件,可注册到 SQLServer 中调用,也可注册为 COM 库,还可在语言中直接调用声明的
函数,由于在文章中没有上传文件的功能,因此,我先把此 DLL 文件上传到“我的资源”中,
有兴趣者可下载。
说明:本文不讨论哪种方法好和坏,在于列举出后二种方法,供大家参考,只有实用的才
是最好的。
1、扩展存储过程的引入
首 先 ,我 们 需 要 知 道 在 SQLServer ( 7.0 以 上 版 本 ) 中 有 一 个 扩 展 存 储 过 程 , 名 叫
sp_addextendedproc,这是干什么用的呢,查它的帮助呀,不就知道了 J,在 SQLServer 的
帮助中是这样描述的:向 Microsoft SQL Server 注册新扩展存储过程的名称。语法为:
sp_addextendedproc [@functname=] 'procedure' , [@dllname=] 'dll'。由此我们知道,它的功能
是把已经写好在外部 DLL 文件中的函数引入到 SQLServer 中,提供给其它 SQL 代码调用。
其用法示例为:
USE master
GO
EXEC sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll'
上面的语句表示把外部 DLL 文件 c:\xp_hello.dll 中的函数 xp_hello 引入到 SQLServer 中,在
执行完上面的语句后,主库中就多了一个名为 xp_hello 的扩展存储过程,我们在其它脚本
中就可以调用此扩展存储过程了。有一点限定的是,sp_addextendedproc 只能在 master 中执
行,如果在其它库中调用 xp_hello,需要加上 master 限定库名。
2、编写外部 DLL 文件

好了,我们知道了怎样在 SQLServer 中加载外部扩展存储过程,接下来,我们要做什
么呢,对了,在外部 DLL 中怎样编写符合 SQLServer 调用的函数。在 VC6 以上版本中,我
们在安装的目录下能找到一个 VC++头文件,名叫 srv.h,它主要是提供给编程人员编写
SQLServer 扩展存储过程用的,人们称它为 ODS(Open Data Services)开放数据服务接口头文
件,里面为众多的常量、结构体、以及从 DLL 文件 opends60.dll 中导入的众多函数。因此,
我们在编写自己的 DLL 文件时,需要包含此头文件,然后编写符合 SQLServer 扩展存储过
程要求的、声明导出方式为 cdecl 约定(由调用者清除堆栈)的函数。编写示例:
SRVRETCODE xp_hello(SRV_PROC* pSrvProc)
{
srv_sendmsg(pSrvProc, SRV_MSG_ERROR, XP_HELLO_ERROR, SRV_INFO, 1,
NULL, 0, (DBUSMALLINT) __LINE__,
"Usage: exec xp_hello <@param1 output>",
SRV_NULLTERM);
srv_senddone(pSrvProc, (SRV_DONE_ERROR | SRV_DONE_MORE), 0, 0);
}
功能:这个示例显示怎样调用的输出字符串。上面的示例是在 VC 环境下开发的示例,实
际上,只要遵守调用约定,用什么语言都可以实现,由于本人对 Delphi 比对 VC 熟悉,我
在这里重点讲解在 Delphi 下的编写过程。
在 Delphi 下开发,需要把 VC 下的头文件 srv.h 翻译为 Delphi 单元文件,便于调用,经过本
人努力,已经翻译为 OdsApi7.pas 单元文件,内容如下:
{******************************************************************************
}
{ @UnitName : OdsApi7 }
{ @Project : Algorism }
{ @Copyright : 1989 - 1999 Microsoft Corporation. }
{ @Translator : 杨连山, yangls@263.net }
{ @CreateDate : 2005-6-22 14:37:53 }
{ @LastUpdate : 2005-6-22 14:37:53 by 杨连山 }
{ }
{ @Description : ODS(Open Data Services)开放数据服务接口单元文件, 转换自 VC7 下的}
{ srv.h 头文件. }
{ }

{ @Comment : 转换者: 杨连山 }
{ 1、您可以免费使用和分发本单元文件, 但不能作为商业应用之全部或部分.}
{ 2、在使用中如造成任何损失, 本转换者概不负责. }
{ 3、转换者不保证本单元转换全部正确, 如您发现或修正后, 有义务反馈 }
{ 最新版给转换者. 发到 yangls@263.net }
{ 4、请保留以上说明信息 }
{ }
{ @History : 2005-06-22 杨连山转换 }
{ }
{******************************************************************************
}
unit OdsApi7;
interface
{$DEFINE DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
{$STACKFRAMES ON}
{$WARNINGS OFF}
{$ENDIF}
uses Windows;
// ODS uses pack(4) on all CPU types
{$ALIGN ON}
{$MINENUMSIZE 4}
// Formats of data types
type
DBBOOL = System.LongBool;
DBBYTE = System.BYTE;
DBTINYINT = System.Shortint;
DBSMALLINT = System.SmallInt;
DBUSMALLINT = System.Word;
DBINT = System.Integer;
DBCHAR = System.Char;
PDBCHAR = ^DBChar;
DBBINARY = System.BYTE;
DBBIT = (_0, _1);
DBFLT8 = System.Double;
TDBDATETIME = record // Format for SRVDATETIME
dtdays: Longint; // number of days since 1/1/1900

dttime: LongWord; // number 300th second since mid
end;
TDBMONEY = record // Format for SRVMONEY
mnyhigh: Longint;
mnylow: LongWord;
end;
DBFLT4 = Single;
DBMONEY4 = Longint;
TDBDATETIME4 = record // Format for SRVDATETIM4
numdays: Word; // number of days since 1/1/1900
nummins: Word; // number of minutes sicne midnight
end;
const
MAXNUMERICLEN = 16;
type
TDBNUMERIC = record // Format for
SRVNUMERIC,SRVNUMERICN,SRVDECIMAL,SRVDECIMALN
precision: BYTE;
scale: BYTE;
sign: BYTE;
val: array[0..MAXNUMERICLEN - 1] of BYTE;
end;
TDBDECIMAL = TDBNUMERIC;
// Constants used by APIs
const
// Type Tokens
SRV_TDS_NULL = BYTE($1f);
SRV_TDS_TEXT = BYTE($23);
SRV_TDS_GUID = BYTE($24);
SRV_TDS_VARBINARY = BYTE($25);
SRV_TDS_INTN = BYTE($26);
SRV_TDS_VARCHAR = BYTE($27);
SRV_TDS_BINARY = BYTE($2d);
SRV_TDS_IMAGE = BYTE($22);
SRV_TDS_CHAR = BYTE($2f);
SRV_TDS_INT1 = BYTE($30);
SRV_TDS_BIT = BYTE($32);
SRV_TDS_INT2 = BYTE($34);
剩余43页未读,继续阅读

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论7