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.