Criptografia no SQL 2000

 

No SQL 2000 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 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',UPPER(@D))>0

                    SET @D=REPLACE(UPPER(@D),'WITH ENCRYPTION', '')

 

SET @D=REPLACE(UPPER(@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

*/

 

Podemos, ainda, adaptar a procedure DECRIPTA para que atenda às nossas necessidades de decriptar VIEWS e FUNCTIONS.

 

Agnaldo Diogo dos Santos é Tecnólogo em Processamento de Dados formado pela FATEC, pós-graduando em Matemática e Estatística pela Universidade Federal de Lavras, Microsoft Certified Systems Engineer, Microsoft Certified Database Administrator, Microsoft Certified Solution Developer e Sun Certified Programmer for the Java 2 Platform 1.4. É sócio da consultoria 50MINUTOS desde 1993 e, nas horas vagas, seu hobby é dar aulas (bancos de dados) na Impacta Tecnologia.