Enviado pelo Leitor: Criptografia no SQL 2000

Veja neste artigo enviado por Agnaldo Diogo dos Santos, como trabalhar com Criptografia no SQL Server 2000.

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.

 

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

Artigos relacionados