Published on

February 3, 2021

Preservando la confidencialidad en SQL Server: cifrado y descifrado de procedimientos almacenados, vistas y funciones

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
GO

Al 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 @decryptedMessage

Si 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.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.