Criptografia de objetos no SQL Server

nesse artigo o Agnaldo mostra como funciona e como "quebrar" a cláusula with encryption do SQL Server



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.

Isso nos dá a segurança de que o usuário, mesmo sabendo a senha do administrador (sa), não tenha acesso ao código-fonte do objeto.

listagem 1. criando uma procedure

use northwind
go


create 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
*/

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados