En muchas empresas, SQL Server se utiliza para almacenar la lógica empresarial o de aplicaciones en forma de procedimientos almacenados, vistas y funciones. Sin embargo, puede haber la necesidad de preservar la confidencialidad y mantener la seguridad de ciertos procedimientos, vistas o funciones. SQL Server proporciona una solución para esto al permitir el cifrado de estos objetos utilizando la opción WITH ENCRYPTION.
Cifrando una función definida por el usuario
Para cifrar una función definida por el usuario, simplemente agregue la opción WITH ENCRYPTION a la declaración CREATE FUNCTION. Por ejemplo:
CREATE FUNCTION dbo.getHash ( @inputString VARCHAR(20) )
RETURNS VARBINARY(8000)
AS BEGIN
DECLARE @salt VARCHAR(32)
DECLARE @outputHash VARBINARY(8000)
SET @salt = '9CE08BE9AB824EEF8ABDF4EBCC8ADB19'
SET @outputHash = HASHBYTES('SHA2_256', (@inputString + @salt))
RETURN @outputHash
END
GOAl cifrar la función, el contenido se disfraza y no se puede escribir o ver utilizando medios convencionales en SQL Server Management Studio. La definición de la función no aparece en la columna de definición de sys.sql_modules, lo que proporciona una capa adicional de seguridad.
Descifrando una función
Si hay necesidad de descifrar una función, se puede hacer utilizando una Conexión de Administrador Dedicada (DAC) a SQL Server. La DAC solo se puede utilizar si ha iniciado sesión en el servidor y está utilizando un cliente en ese servidor, y si tiene el rol de sysadmin.
El proceso de descifrado implica recuperar el valor cifrado de la definición del procedimiento de sys.sysobjvalues, obtener el valor cifrado de un procedimiento ‘en blanco’ y luego realizar una operación XOR entre ellos para recuperar la salida del procedimiento. Aquí hay un ejemplo:
-- Conéctese utilizando la DAC y luego ejecute lo siguiente
SET NOCOUNT ON
GO
ALTER PROCEDURE dbo.TestDecryption WITH ENCRYPTION AS
BEGIN
PRINT 'Este texto va a ser descifrado'
END
GO
DECLARE @encrypted NVARCHAR(MAX)
SET @encrypted = (
SELECT imageval
FROM sys.sysobjvalues
WHERE OBJECT_NAME(objid) = 'TestDecryption' )
DECLARE @encryptedLength INT
SET @encryptedLength = DATALENGTH(@encrypted) / 2
DECLARE @procedureHeader NVARCHAR(MAX)
SET @procedureHeader = N'ALTER PROCEDURE dbo.TestDecryption WITH ENCRYPTION AS '
SET @procedureHeader = @procedureHeader + REPLICATE(N'-',(@encryptedLength - LEN(@procedureHeader)))
EXEC sp_executesql @procedureHeader
DECLARE @blankEncrypted NVARCHAR(MAX)
SET @blankEncrypted = (
SELECT imageval
FROM sys.sysobjvalues
WHERE OBJECT_NAME(objid) = 'TestDecryption' )
SET @procedureHeader = N'CREATE PROCEDURE dbo.TestDecryption WITH ENCRYPTION AS '
SET @procedureHeader = @procedureHeader + REPLICATE(N'-',(@encryptedLength - LEN(@procedureHeader)))
DECLARE @cnt SMALLINT
DECLARE @decryptedChar NCHAR(1)
DECLARE @decryptedMessage NVARCHAR(MAX)
SET @decryptedMessage = ''
SET @cnt = 1
WHILE @cnt <> @encryptedLength
BEGIN
SET @decryptedChar =
NCHAR(
UNICODE(SUBSTRING(
@encrypted, @cnt, 1)) ^
UNICODE(SUBSTRING(
@procedureHeader, @cnt, 1)) ^
UNICODE(SUBSTRING(
@blankEncrypted, @cnt, 1))
)
SET @decryptedMessage = @decryptedMessage + @decryptedChar
SET @cnt = @cnt + 1
END
SELECT @decryptedMessageSi no es posible o preferible el acceso directo al servidor, también hay paquetes de software de descifrado de terceros basados en .NET disponibles que se pueden utilizar para descifrar procedimientos almacenados, vistas y funciones cifrados.
Al utilizar técnicas de cifrado y descifrado en SQL Server, puede garantizar la seguridad y confidencialidad de sus procedimientos almacenados, vistas y funciones, protegiendo la propiedad intelectual contenida en ellos.