10多年前用過MSSQL 調用C#程序集來實現數據的加密和解密,也搞過經過字符偏移實現簡單的加密和解密。此次就總結一下吧:sql
C#以下:加密
public class CLRFunctions { /// <summary> /// 數據加密 /// </summary> /// <param name="target"></param> /// <returns></returns> public static String DataEncrypt(string target, int keyLen) { if (string.IsNullOrEmpty(target)) return string.Empty; string str = string.Empty; char[] arr = target.ToCharArray(); for (int i = 0; i < arr.Length; i++) { char c = arr[i]; str = str + ((char)(c + keyLen)); } return str; } /// <summary> /// 數據解密 /// </summary> /// <param name="target"></param> /// <returns></returns> public static String DataDecrypt(string target, int keyLen) { if (string.IsNullOrEmpty(target)) return string.Empty; string str = string.Empty; char[] arr = target.ToCharArray(); for (int i = 0; i < arr.Length; i++) { char c = arr[i]; str = str + ((char)(c - keyLen)); } return str; } }
SQL以下,這裏須要啓用程序集功能,而後在建立程序集:spa
exec sp_configure 'show advanced options', '1'; go reconfigure; go exec sp_configure 'clr enabled', '1' go reconfigure; exec sp_configure 'show advanced options', '1'; go if exists (select * from sys.assemblies where name='CLRFunctions') drop assembly CLRFunctions; go CREATE ASSEMBLY CLRFunctions FROM 'd:\sql\xxx.dll' ; Go if exists(select 0 from sysobjects where name='dbo.DataEncrypt' and xtype='FN') begin drop function dbo.DataEncrypt end go CREATE FUNCTION dbo.DataEncrypt ( @target as nvarchar (200), @keyLen as int ) RETURNS nvarchar (200) AS EXTERNAL NAME CLRFunctions.CLRFunctions.DataEncrypt go if exists(select 0 from sysobjects where name='dbo.DataDecrypt' and xtype='FN') begin drop function dbo.DataDecrypt end go CREATE FUNCTION dbo.DataDecrypt ( @target as nvarchar (200), @keyLen as int ) RETURNS nvarchar (200) AS EXTERNAL NAME CLRFunctions.CLRFunctions.DataDecrypt
後來嘗試用SQL實現C#的ToCharArray方法,在實現字符偏移,SQL以下:code
if exists(select 0 from sysobjects where name='DataEncrypt' and xtype='FN') begin drop function dbo.DataEncrypt end go CREATE FUNCTION dbo.DataEncrypt(@target nvarchar (200),@keyLen int) RETURNS nvarchar (200) AS BEGIN DECLARE @position int,@ret nvarchar(200); SET @position = 1; set @ret='' WHILE @position <= len(@target) BEGIN set @ret=@ret+ nchar(unicode(SUBSTRING(@target, @position, 1))+@keylen) SET @position = @position + 1 END; RETURN @ret END go if exists(select 0 from sysobjects where name='DataDecrypt' and xtype='FN') begin drop function dbo.DataDecrypt end go CREATE FUNCTION dbo.DataDecrypt(@target nvarchar (200),@keyLen int) RETURNS nvarchar (200) AS BEGIN DECLARE @position int,@ret nvarchar(200); SET @position = 1; set @ret='' WHILE @position <= len(@target) BEGIN set @ret=@ret+ nchar(unicode(SUBSTRING(@target, @position, 1))-@keylen) SET @position = @position + 1 END; RETURN @ret END