您的位置:首页 > 数据库

CLR函数 SQL直接调用 C# DLL MSSQL DES 加解密

2012-06-19 19:40 393 查看
(原 :http://topic.csdn.net/u/20100929/17/21bfc421-4ace-435f-baea-4d352d1015e3.html)

因业务升级,将原用户DES密文转换为MD5,需要在SQL中进行DES解密操作,故使用CLR函数实现,特此记录,以备后用。--by RYHAN

C#程序集 dll 文件

using System;
using System.IO;
using System.Text;
using System.Data;
using System.Data.SqlTypes;
using System.Security.Cryptography;
using Microsoft.SqlServer.Server;

public class DES
{
[SqlFunction(IsDeterministic=true, IsPrecise=true)]
public static SqlString DESEncrypt(SqlString text, SqlString key)
{
if (text.IsNull || key.IsNull || key.Value.Length < 8)
return null;

return (SqlString)_DESEncrypt(Encoding.Default.GetBytes((string)text),
Encoding.Default.GetBytes((string)key),
new byte[] { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF });
}
// Encrypt with DES
private static string _DESEncrypt(byte[] text, byte[] key, byte[] iv)
{
string entext;

using (MemoryStream mstream = new MemoryStream())
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
CryptoStream estream = new CryptoStream(mstream, des.CreateEncryptor(key, iv), CryptoStreamMode.Write);
try
{
estream.Write(text, 0, text.Length);
estream.FlushFinalBlock();
entext = Convert.ToBase64String(mstream.ToArray());
}
finally
{
estream.Close();
des.Clear();
}
}

return entext;
}

[SqlFunction(IsDeterministic=true, IsPrecise=true)]
public static SqlString DESDecrypt(SqlString text, SqlString key)
{
if (text.IsNull || key.IsNull || key.Value.Length < 8)
return null;

return (SqlString)_DESDecrypt(Convert.FromBase64String((string)text),
Encoding.Default.GetBytes((string)key),
new byte[] { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF });
}
// Decrypt with DES
private static string _DESDecrypt(byte[] text, byte[] key, byte[] iv)
{
string detext;

using (MemoryStream mstream = new MemoryStream())
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
CryptoStream estream = new CryptoStream(mstream, des.CreateDecryptor(key, iv), CryptoStreamMode.Write);
try
{
estream.Write(text, 0, text.Length);
estream.FlushFinalBlock();
detext = Encoding.Default.GetString(mstream.ToArray());
}
finally
{
estream.Close();
des.Clear();
}
}

return detext;
}
}


SQL CLR 函数

use master
go
-- 启用 SQL Server 的 CLR 功能
exec sp_configure 'show advanced options',1;
go
reconfigure
go
exec sp_configure 'clr enabled',1;
go
reconfigure
go

if object_id('dbo.des_encrypt','FS') is not null
drop function dbo.des_encrypt;
go

if object_id('dbo.des_decrypt','FS') is not null
drop function dbo.des_decrypt;
go

-- 创建程序集
if exists (select * from sys.assemblies where name='DES')
drop assembly DES;
go
create assembly DES authorization dbo
from 'C:\clrDES.dll' -- dll 文件路径
with permission_set=safe;
go

create function dbo.des_encrypt (@text nvarchar(max), @key nvarchar(128))
returns nvarchar(max)
as external name DES.DES.DESEncrypt;
go

-- select dbo.des_encrypt(N'hello world', N'88888888');

create function dbo.des_decrypt (@text nvarchar(max), @key nvarchar(128))
returns nvarchar(max)
as external name DES.DES.DESDecrypt;
go

-- select dbo.des_decrypt(N'+GeLDT6kAxZlm2pnFX8X4w==',N'88888888');


因业务升级,将原用户DES密文转换为MD5,需要在SQL中进行DES解密操作,故使用CLR函数实现,特此记录,以备后用。--by RYHAN
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: