使用sql2000 MD5加密插件 xp_md5_cppfans.rar
安装方法】
① 通过执行 SQL 语句注册存储过程:
打开 Master 数据库,然后执行下面 SQL 语句
EXEC sp_addextendedproc 'xp_md5', 'd:\pathname\xp_md5.dll'
如果注册的文件不包含路径,只有文件名,MSSQL会在这个文件夹里面找这个.dll
C:\Program Files\Microsoft SQL Server\MSSQL\Binn
② 创建用来支持 select 语句的 MD5 函数 fn_md5
打开想要执行这个存储过程的用户数据库,执行下面的 SQL:
CREATE FUNCTION fn_md5 (@string VARCHAR(8000))
RETURNS CHAR(32) AS
BEGIN
DECLARE @hash CHAR(32)
EXEC master.dbo.xp_md5 @string, @hash OUTPUT
RETURN @hash
END
.---------------------------------------------------------------------------.
【使用方法】
① 直接执行, 由于 xp_md5 在 master 数据库里面, 所以前面必须有 master.
EXEC master.dbo.xp_md5 'Hello world!'
② 通过 fn_md5 支持 select 语句, 这个函数在用户当前使用的数据库里面.
SELECT dbo.fn_md5('Hello world!')
.---------------------------------------------------------------------------.
|【程序说明】 |
| xp_md5.bpr 存储过程 C++ Builder 6.0 工程文件 |
| srv.h Borland C++ Builder 自带的支持的 MSSQL 存储过程的头文件 |
| 这个文件在 MSSQL 7 和 MSSQL 2000 里面是相同的, M$ 没改过 |
| OPENDS60.LIB 由于 C++ Builder 自带的文件比较旧,支持 MSSQL 7 的, |
| 这个程序带了一个 OPENDS60.LIB 文件,支持 MSSQL 2000 |
| md5.h Christophe Devine 原作,没做任何修改 |
| md5.cpp Christophe Devine 原作,没做任何修改 |
| xp_md5_main.cpp 存储过程主程序文件,根据 Vic Mackey 的存储过程修改的 |
\*-------------------------------------------------------------------------*/
#include <srv.h>
#include "md5.h"
#pragma link "opends60.lib"
//---------------------------------------------------------------------------
#ifdef __cplusplus
extern "C" {
#endif
//---------------------------------------------------------------------------
// MSSQL 的存储过程 xp_md5
//---------------------------------------------------------------------------
__declspec(dllexport) SRVRETCODE WINAPI xp_md5(SRV_PROC* pSrvProc)
{
int nArgs = srv_rpcparams(pSrvProc);
if(nArgs > 0)
{
char szHash[33];
md5_string((const char*)srv_paramdata(pSrvProc, 1), szHash, srv_paramlen(pSrvProc, 1));
if (nArgs > 1)
{
srv_paramsetoutput(pSrvProc, 2, (unsigned char*)szHash, 32, FALSE);
}
else // don't send row if output buffer provided
{
srv_describe(pSrvProc, 1, "MD5", SRV_NULLTERM, SRVCHAR, 32, SRVCHAR, 32, (void*)szHash);
srv_sendrow(pSrvProc);
}
srv_senddone(pSrvProc, SRV_DONE_FINAL, 0, 0);
return 0;
}
srv_sendmsg(pSrvProc, SRV_MSG_ERROR, 20000, SRV_INFO, 1, NULL, 0, (DBUSMALLINT) __LINE__, "Usage: EXEC xp_md5 <@string> [@hash OUTPUT]", SRV_NULLTERM);
srv_senddone(pSrvProc, SRV_DONE_ERROR | SRV_DONE_MORE, 0, 0);
return 1;
}
//---------------------------------------------------------------------------
// MSSQL 2000 存储过程必须有的函数
//---------------------------------------------------------------------------
__declspec(dllexport) ULONG WINAPI __GetXpVersion()
{
return ODS_VERSION;
}
//---------------------------------------------------------------------------
// DLL 文件的主程序
//---------------------------------------------------------------------------
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_call_reason, LPVOID lpReserved)
{
return TRUE;
}
//---------------------------------------------------------------------------
#ifdef __cplusplus
} //extern "C"
#endif
//--------------------------------------------------------------------------- |