Descifrando el enigma. Cifrando y descifrando en SQL Server de forma sencilla

Una forma de las formas que tenemos de proteger nuestra información en nuestras bases de datos es hacerlo a través del cifrado de datos. Todos sabemos que los lenguajes de programación aportan librerías para ello, y que es bastante cómodo gestionarlo desde el código fuente de nuestras aplicaciones. Muchos hemos trabajado con el namespace System.Security.Cryptography de .NET, que nos permite manipular muchos de los detalles de criptografía.

Pero a veces, nos interesa que los algoritmos de criptografía se ejecuten en el SGBD. Yo personalmente prefiero trabajar siempre con procedimientos almacenados, y es aquí donde tengo la necesidad de utilizar toda la tecnología de criptografía de SQL Server.

La forma más simple para cifrar datos en SQL Server, sin la necesidad de contar con las gestiones de un administrador es utilizar una clave secreta. No voy a entrar en si es la mejor o peor forma de cifrado, pues mi intención es que aquellos que aún no se han adentrado en estas técnicas de protección comiencen a utilizarlas.

Sql server nos aporta dos funciones para el cifrado simétrico:

  • EncryptedbyPassphrase: Cifra datos mediante una frase de contraseña
  • DecryptByPassPhrase : Descifra los datos que se cifraron con una frase de contraseña

Vamos a ver un sencillo ejemplo. Como siempre utilizaremos la base de datos de ejemplo Pubs. Creamos una tabla que se va a llamar PruebaCifrado , pero lo vamos a hacer con la instrucción SELECT.. INTO.. de manera que la columna au_fname se cree con los datos encriptados.Utilizamos para ello la función EncryptedbyPassphrase con los siguientes parámetros:

EncryptByPassPhrase(@clavesecreta, au_fname, 1, CONVERT( varbinary,au_id))

  • 1. La clave secreta
  • 2. La columna de la tabla origen que vamos a cifrar (au_lname de authors)
  • 3. 1, porque vamos a agregar un autenticador que nos ayudará a impedir la sustitución del valor de los campos cifrados (Un valor de una fila no se podrá cambiar con otra. El autenticador será la clave primaria)
  • 4. El autenticador: La clave primaria (au_id)

Declaramos la clave secreta y creamos la tabla:

DECLARE @clavesecreta varchar(200);
SET @clavesecreta= ‘U-571 Operacion Enigma’;

Select au_id,EncryptByPassPhrase(@clavesecreta, au_fname, 1,
CONVERT( varbinary, au_id)) as ‘au_fname’
into PruebaCifrado
from authors
order by au_id

El resultado de la tabla sería el siguiente ( solo muestro algunas filas de ejemplo):

au_id

au_fname

172-32-1176

0x010000008AED4E240D1076B874C92253029363AAA6F006007066E57F78BDD4B7601B404F730C5217CE09662F4B608E4947C68458

213-46-8915

0x010000002F5859168EB04C5483C427B5B8B0B059CD9CB976C00E8754FE001A5121EC813ED65EB3A496CBFF7CB7AE679DC4DC3305

238-95-7766

0x010000000319DE1F08E1A4E51CF692BD5C2CB94530A58B56FE4BB19034A9486751791261326FED5AB3A7C14D5CD60CA8B02AAB5C

267-41-2394

0x01000000B896A4CF0D1221BF56837CB347D003D25B7E5A77E02D84E7FCDA2F59395979070B97DAEF62E35DACF1998BF31EEEE4B2

274-80-9391

0x010000002380AC03C124E67196333BFD10E0E2D1D4836C9F69E1CD6B08954EAA64B99016D8B52452020532921F4820E5975E58D0

 

 

Totalmente ilegible, verdad. ¡Me encanta!

Pues bien saquemos la máquina “Enigma” y descifremos. Para ello vamos a utilizar la función DecryptByPassPhrase con los siguientes parámetros:

DecryptByPassphrase(@clavesecreta, au_fname, 1 ,CONVERT(varbinary, au_id))

  • 1. La clave secreta
  • 2. La columna de la tabla que vamos a descifrar
  • 3. 1, porque indicamos que hemos utilizado un autenticador
  • 4. El autenticador: La clave primaria (au_id)

Por lo tanto descifremos:

SELECT au_id, CONVERT(varchar,
DecryptByPassphrase(@clavesecreta, au_fname,
1 ,
CONVERT(varbinary, au_id))) AS ‘au_fname desencriptada’
from PruebaCifrado
order by au_id

Obtendremos el siguiente resultado:

au_id

au_fname desencriptada

172-32-1176

Johnson

213-46-8915

Marjorie

238-95-7766

Cheryl

267-41-2394

Michael

274-80-9391

Dean

341-22-1782

Meander

409-56-7008

Abraham

427-17-2319

Ann

472-27-2349

Burt

486-29-1786

Charlene

527-72-3246

Morningstar

648-92-1872

Reginald

672-71-3249

Akiko

712-45-1867

Innes

722-51-5454

Michel

724-08-9931

Dirk

724-80-9391

Stearns

756-30-7391

Livia

807-91-6654

Sylvia

846-92-7186

Sheryl

893-72-1158

Heather

899-46-2035

Anne

998-72-3567

Albert

¿Y ahora qué? Pues a la espera de mostraros un ejemplo con clave pública, os recomiendo que veáis la película U-571 en la que pretenden capturar la máquina de cifrado alemana Enigma, para mí una de las mejores películas de submarinos, ¿o me recomendáis otra?

 

2 comentarios en “Descifrando el enigma. Cifrando y descifrando en SQL Server de forma sencilla”

  1. Pero ello quiere decir que cuando creas las tablas, los campos afectados por la encriptacion tienen que tener un tamaño muy superior a la que corresponderia normalmente… o, tienen un tamaño estandar??
    Vamos que segun el ejemplo el auf_name podria ser de varchar(15), pero en realidad seria varchar(100)???

  2. Hola X, Gracias por tu comentario.
    Tienes que tener en cuenta que el valor devuelto por la función es un varbinary con un máximo de 8000 bytes.

    Este es el límite y el tipo de dato con el que deberías crear la columna que almacene los datos cifrados.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *