Publicado em 10/03/2008 em www.50minutos.com.br por Agnaldo Diogo dos Santos
No SQL Server podemos implementar um nível adicional de segurança, ao codificar, usando a cláusula with encryption do comando create para os objetos stored procedure, function, trigger ou view.
listagem 1. criando uma procedure
use northwind
gocreate proc busca_empregados
as
select employeeid, firstname, lastname from employees
go
Podemos recuperar o código-fonte, a qualquer momento, usando a procedure sp_helptext.
listagem 2. vendo o código-fonte de uma procedure
exec sp_helptext busca_empregados
/*
resultado:
text
---------------------------------------------------------------
create proc busca_empregados
as
select employeeid, firstname, lastname from employees
*/
Para que o código-fonte não possa ser visualizado, usamos a cláusula with encryption.
listagem 3. criando uma procedure encriptada e tentando ver o código-fonte
create proc busca_empregados_2
with encryption
as
select employeeid, firstname, lastname from employees
go
exec sp_helptext busca_empregados_2
/*
resultado:
the object comments have been encrypted.
*/
E se precisarmos recuperar o código-fonte? o que fazer? o sql server usa um algoritmo muito simples para criptografar seus objetos, baseado no operador xor (ou exclusivo). Podemos reverter facilmente essa criptografia, aplicando, novamente, o xor.
listagem 4. criando uma procedure que decripta procedures
create procedure decripta (@objeto varchar(50))
as
declare @a nvarchar(4000),
@b nvarchar(4000),
@c nvarchar(4000),
@d nvarchar(4000),
@i int,
@t bigint
set @a=(select ctext from syscomments where id = object_id(@objeto))
set @b='alter procedure '
+ @objeto
+' with encryption as '
+replicate('-', 4000-62)
execute (@b)
set @c=(select ctext from syscomments where id = object_id(@objeto))
set @b='create procedure '
+ @objeto
+' with encryption as '
+replicate('-', 4000-62)
set @i=1
set @d = replicate(n'a', (datalength(@a) / 2))
while @i<=datalength(@a)/2
begin
set @d = stuff(@d, @i, 1,
nchar(unicode(substring(@a, @i, 1)) ^
(unicode(substring(@b, @i, 1)) ^
unicode(substring(@c, @i, 1)))))
set @i=@i+1
end
execute ('drop procedure '+ @objeto)
if charindex('with encryption',lower(@d))>0
set @d=replace(lower(@d),'with encryption', '')
execute(@d)
go
Para usar a procedure, é só fazer como no exemplo abaixo:
listagem 05. decriptando uma procedure
exec decripta 'busca_empregados_2'exec sp_helptext busca_empregados_2
/*
resultado:
text
---------------------------------------------------------------
create proc busca_empregados_2
as
select employeeid, firstname, lastname from employees
*/