Encriptar y desencriptar datos

Encriptar y Desencriptar datos en SQL Server

La importancia de proteger los datos es una actividad que no se debe descuidar, cuando se guarda información en las tablas, algunos datos no deben ser fácilmente accesibles y si de alguna forma se pueden acceder a estos, deben en los posible presentarse de manera encriptada.

Tipo de dato Binarios

Los tipos de datos binarios permiten guardar datos en un formato que se muestra diferente al texto plano, estos tipos de datos tienen una longitud fija (binary)  y logitud variable (varbinary). Cuando desee encriptar los datos de las tablas de su base de datos siguiendo las instrucciones de este ejemplo, los campos que va a encriptar deben ser de estos tipos.



Encriptando los datos

Existen varias formas de guardar los datos encriptados en las tablas, se pueden usar diversos algoritmos o se pueden crear y generar los propios. Por ejemplo, puede generar datos encriptados usando Visual Studio .Net y el algoritmo MD5.
Para este ejercicio utilizaremos las funciones de SQL Server para guardar los datos en formato binario,  para ello se puede usar la función EncryptByPassPhrase para encriptar y para desencriptar se utiliza la función DecryptByPassPhrase.

Para poder mostrar los datos sin encriptar se utilizará Cast para convertir el tipo de dato. (Ver funciones de conversión de datos)

Función EncryptByPassPhrase

Permite encriptar datos, asignando una clave de tipo texto.
Sintaxis:
EncryptByPassPhrase ( ‘FraseClave’ , ‘TextoAEncriptar’ )
Donde:
FraseClave: se utilizará como clave simétrica para poder desencriptar.
TextoAEncriptar: Texto plano a encriptar.

Función DecryptByPassPhrase

Permite desencriptar datos, es necesario dar la clave simétrica asignada al momento de encriptar.
Sintaxis:
DecryptByPassPhrase ( ‘FraseClave’ , ‘TextoADesencriptar’ )
Donde:
FraseClave: es clave simétrica utilizada al encriptar.
TextoADesencriptar: Texto a desencriptar, generalmente es el contenido de un campo.

Importante: Los campos donde se guardarán los datos deben ser de tipo binarios (varbinary).

Ejemplo

Usando la base de datos Northwind.
use Northwind
go

Crear una tabla para usuarios, donde se encriptará tanto el nombre del usuario como su password.

Create table Usuarios
(
UsuariosCodigo nchar(4),
UsuariosNombre varbinary(200),
UsuariosPassword varbinary(200)
constraint UsuariosCodigoPK Primary key (UsuariosCodigo)
)
go

Insertar los siguientes registros
Nombre: TrainerSQL
Password: Bum2020

insert into usuarios values
(‘0102’,EncryptByPassPhrase(‘ClaveUsuarios’,’TrainerSQL’),
EncryptbyPassphrase(‘ClaveUsuarios’,’Bum2020′))
go

Listar el registros para visualizar los datos encriptados
select * from Usuarios
go

Si se desea listar los registros con los datos desencriptados

select UsuariosCodigo,
Cast(DecryptByPassPhrase(‘ClaveUsuarios’, UsuariosNombre) As varchar(max)) As ‘Nombre’,
Cast(DecryptByPassPhrase(‘ClaveUsuarios’, UsuariosPassword) As varchar(200)) As ‘Password’
from Usuarios
go

Si el texto usado como clave simétrica no es el correcto, muestra Null en los campos encriptados. Note que para desencriptar se ha utilizado la clave simétrica OtraClave, que no la correcta.

select UsuariosCodigo,
Cast(DecryptByPassPhrase(‘OtraClave‘, UsuariosNombre) As varchar(max)) As ‘Nombre’,
Cast(DecryptByPassPhrase(‘OtraClave‘, UsuariosPassword) As varchar(200)) As ‘Password’
from Usuarios
go