1,创建c# dll文件
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace DecryptClr
{
public class DecryptData
{
#region ========解密========
/// <summary>
/// 解密
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public static string DecryptText(string text)
{
return text.Trim() == "" ? "" : Decrypt(text, "wanmeishijie");
}
/// <summary>
/// 解密数据
/// </summary>
/// <param name="text"></param>
/// <param name="sKey"></param>
/// <returns></returns>
public static string Decrypt(string text, string sKey)
{
text = text.Trim();
sKey = sKey.Trim();
var des = new DESCryptoServiceProvider();
var len = text.Length / 2;
var inputByteArray = new byte[len];
int x;
for (x = 0; x < len; x++)
{
var i = Convert.ToInt32(text.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
des.Key = Encoding.ASCII.GetBytes(MD5(sKey).Substring(0, 8));
des.IV = Encoding.ASCII.GetBytes(MD5(sKey).Substring(0, 8));
var ms = new MemoryStream();
var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}
// ReSharper disable once InconsistentNaming
public static string MD5(string str)
{
//微软md5方法参考return FormsAuthentication.HashPasswordForStoringInConfigFile(str, "md5");
var b = Encoding.Default.GetBytes(str);
b = new MD5CryptoServiceProvider().ComputeHash(b);
return b.Aggregate("", (current, t) => current + t.ToString("X").PadLeft(2, '0'));
}
#endregion ========解密========
}
}
2,开启数据库 CLR 支持,并且指定某个数据库支持 unsafe
模式。
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
GO
ALTER DATABASE MotoSys_KM2 SET TRUSTWORTHY ON;
GO
3,用户授权
ALTER AUTHORIZATION on DATABASe::MotoSys_KM2 to sa
GO
4,加载程序集
--DROP ASSEMBLY Decrypt 删除程序集
CREATE ASSEMBLY DecryptClr
FROM 'D:\DB\Decrypt.dll'
WITH PERMISSION_SET = UNSAFE;
GO
5,创建函数
CREATE FUNCTION dbo.Decrypt
(
@text AS nvarchar(255)
)
RETURNS nvarchar(255)
AS
EXTERNAL NAME DecryptClr.[DecryptClr.DecryptData].DecryptText;
GO
6,调用函数
select top 10 dbo.Decrypt(Kscj) as kscj from Exam_Person_Record order by AutoId desc;