使用 Transact-SQL开启CLR
sp_configure 'show advanced options',1 RECONFIGURE sp_configure 'clr enabled',1 RECONFIGURE
DECLARE @hash AS BINARY(64) = (SELECT HASHBYTES('SHA2_512', (SELECT * FROM OPENROWSET (BULK 'C:/clrDES.dll', SINGLE_BLOB) AS [Data])))
EXEC sp_add_trusted_assembly @hash
编写CLR集成托管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 });
}
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 });
}
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;
}
}
调用示例
select dbo.des_encrypt(N'hello world', N'88888888'); select dbo.des_decrypt(N'+GeLDT6kAxZlm2pnFX8X4w==',N'88888888');
原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/tech/database/277531.html