我开发的系统,其大部分的算法和逻辑都是写在后台的,软件分发后,这些存储过程都是“裸露”的,如何加密呢?
解密:
create PROCEDURE sp_decrypt_sp (@objectName varchar(50))
AS
DECLARE @OrigSpText1 nvarchar(4000), @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000)
declare @i int , @t bigint
--get encrypted data
SET @OrigSpText1=(SELECT ctext FROM syscomments WHERE id = object_id(@objectName))
SET @OrigSpText2=ALTER PROCEDURE + @objectName + WITH ENCRYPTION AS +REPLICATE(-, 3938)
EXECUTE (@OrigSpText2)
SET @OrigSpText3=(SELECT ctext FROM syscomments WHERE id = object_id(@objectName))
SET @OrigSpText2=CREATE PROCEDURE + @objectName + WITH ENCRYPTION AS +REPLICATE(-, 4000-62)
--start counter
SET @i=1
--fill temporary variable
SET @resultsp = replicate(NA, (datalength(@OrigSpText1) / 2))
--loop
WHILE @i <=datalength(@OrigSpText1)/2
BEGIN
--reverse encryption (XOR original+bogus+bogus encrypted)
SET @resultsp = stuff(@resultsp, @i, 1, NCHAR(UNICODE(substring(@OrigSpText1, @i, 1)) ^
(UNICODE(substring(@OrigSpText2, @i, 1)) ^
UNICODE(substring(@OrigSpText3, @i, 1)))))
SET @i=@i+1
END
--drop original SP
EXECUTE (drop PROCEDURE + @objectName)
--remove encryption
--preserve case
SET @resultsp=REPLACE((@resultsp),WITH ENCRYPTION, )
SET @resultsp=REPLACE((@resultsp),With Encryption, )
SET @resultsp=REPLACE((@resultsp),with encryption, )
IF CHARINDEX(WITH ENCRYPTION,UPPER(@resultsp) ) >0
SET @resultsp=REPLACE(UPPER(@resultsp),WITH ENCRYPTION, )
--replace Stored procedure without enryption
execute( @resultsp)
GO
加密:
CREATE PROCEDURE encrypt_this
WITH ENCRYPTION
AS
SELECT *
FROM authors
GO
--------------------4000以内---------------
create PROCEDURE sp_decrypt_sp (@objectName varchar(50))
AS
DECLARE @OrigSpText1 nvarchar(4000), @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000)
declare @i int , @t bigint
--get encrypted data
SET @OrigSpText1=(SELECT ctext FROM syscomments WHERE id = object_id(@objectName))
SET @OrigSpText2=ALTER PROCEDURE + @objectName + WITH ENCRYPTION AS +REPLICATE(-, 3938)
EXECUTE (@OrigSpText2)
SET @OrigSpText3=(SELECT ctext FROM syscomments WHERE id = object_id(@objectName))
SET @OrigSpText2=CREATE PROCEDURE + @objectName + WITH ENCRYPTION AS +REPLICATE(-, 4000-62)
--start counter
SET @i=1
--fill temporary variable
SET @resultsp = replicate(NA, (datalength(@OrigSpText1) / 2))
--loop
WHILE @i <=datalength(@OrigSpText1)/2
BEGIN
--reverse encryption (XOR original+bogus+bogus encrypted)
SET @resultsp = stuff(@resultsp, @i, 1, NCHAR(UNICODE(substring(@OrigSpText1, @i, 1)) ^
(UNICODE(substring(@OrigSpText2, @i, 1)) ^
UNICODE(substring(@OrigSpText3, @i, 1)))))
SET @i=@i+1
END
--drop original SP
EXECUTE (drop PROCEDURE + @objectName)
--remove encryption
--preserve case
SET @resultsp=REPLACE((@resultsp),WITH ENCRYPTION, )
SET @resultsp=REPLACE((@resultsp),With Encryption, )
SET @resultsp=REPLACE((@resultsp),with encryption, )
IF CHARINDEX(WITH ENCRYPTION,UPPER(@resultsp) ) >0
SET @resultsp=REPLACE(UPPER(@resultsp),WITH ENCRYPTION, )
--replace Stored procedure without enryption
execute( @resultsp)
GO
建议说一下原理更实在,不要贴得乱七八糟的!
大力:我把存储过程加密,然后生成你的存储过程,但是解密不成功的.
有个软件Decryptor可以解密 加密的存储过程 触发器