Blogger news

21:12
0
En muchas de las aplicaciones que día a día desarrollamos requerimos cifrar los datos que se almacenan en nuestras bases de datos. El cifrado tiene como objetivo impedir su lectura directa. Por ejemplo, si existe una tabla donde se almacenan las tarjetas de crédito y sus contraseñas, esa información se considerarse confidencial, el cifrado nos garantizara que, aunque se cuente con permisos de lectura, los datos no serán legibles si no se tiene la manera de descifrarlos.

No es recomendable cifrar todo, ya que las operaciones de cifrado/descifrado perjudican el rendimiento.

Microsoft SQL Server 2005 ofrece cuatro alternativas para realizar cifrados de datos:

  • Passphares
  • Asymmetric Key
  • Symmetric Key
  • Certificate Key


PASSPHRASE

Es el método más rápido y simple de todos, pero también el menos seguro.

Para realizar el cifrado solo es necesario poner contraseña, que también se utilizará para descifrar los datos luego. El comando TSQL para cifrar datos es EncryptByPassPhrase y el que se usa para descifrarlos, DecryptByPassPhrase.

Para los ejemplos que mostrare en este Post se utilizara la siguiente tabla:

CREATE TABLE TARJETAS (NUMERO VARBINARY(8000), VENCIMIENTO DATETIME)

Ejemplo Passphrase:

-- Insertando valores en la tabla utilizando Passphrase
INSERT INTO TARJETAS
VALUES (ENCRYPTBYPASSPHRASE('my_pass','12345'), GETDATE())


Ahora ya tenemos un registro con el campo tarjeta que ha quedado cifrado.

Para comprobarlo

SELECT * FROM TARJETAS

El resultado es un valor en el campo de la tarjeta, que no es legible.

El siguiente ejemplo mostrará como leer el registro encriptado:

SELECT CONVERT(VARCHAR(300), DECRYPTBYPASSPHRASE('my_pass', NUMERO)), VENCIMIENTO
FROM TARJETAS


ASYMMETRIC KEY (Claves Asimetricas)

Las claves asimétricas son entidades que pueden protegerse a nivel de la Base de Datos. Contiene una clave privada y otra publica, la privada es protegida por la Master Key; de no existir esta última, entonces se requiere una contraseña. La clave privada puede ser de 512, 1024 0 2048 bits. Esta metodología consume una gran cantidad de recursos pero, a la ves, proporciona un nivel superior de seguridad que el resto de las opciones.

Lo primero que debemos hacer es crear una clave asimétrica en la base de datos

USE CIFRADO
GO
CREATE ASYMMETRIC KEY ClaveAsym
WITH ALGORITHM = RSA_2048
ENCRYPTION BY PASSWORD = 'my_pass'
GO


También es posible crear una clave asimétrica utilizando un archivo externo, como en el siguiente complejo:

CREATE ASYMMETRIC KEY ASYM2
FROM FILE = 'C:\my_llave.key'
ENCRYPTION BY PASSWORD = 'my_pass'


El siguiente paso es insertar en la tabla un valor cifrado con la clave asimétrica.

DECLARE @KEYID INT
SET @KEYID = AsymKey_ID('ClaveAsym')


INSERT INTO TARJETAS VALUES (EncryptByAsymKey(@keyid, '12345'), GETDATE())


Para desencriptar:

DECLARE @KEYID INT
SET @KEYID = AsymKey_ID('ClaveAsym')

SELECT CASRT(DecrypyByAsymKey(@KEYID, NUMERO, 'my_pass') AS VARCHAR(100))
FROM TARJETAS


SYMMETRIC KEY (Claves Simétricas)

Las claves simétricas son un método eficiente para el cifrado y descifrado de datos. Este método, a diferencia de los certificados y claves asimétricas, utiliza un key tanto para el cifrado como para el descifrado.
Al crear una clave simétrica, esta debe ser cifrada utilizando algunas de estas opciones: certificado, password, clave simétrica o clave asimétrica. Estas claves pueden tener más de un cifrado de cada tipo.
Si se utiliza un password para cifrar la clave simétrica, entonces, en vez de usar la clave publica de la base de datos (Master Key), se recurre al algoritmo TRIPLE_DES.

Ejemplo:

El primer paso es crear una clave simétrica:

USE CIFRADO
GO
CREATE SYMMETRIC KEY SYM_KEY
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY PASSWORD = 'my_pass'


El segundo paso, se inserta un registro cifrado con la clave simétrica:

DECLARE @KEYID UNIQUEIDENTIFIER
SET @KEYID = KEY_GUID('SIM_KEY')
DECRYPTION BY PASSWORD = 'my_pass'

INSERT INTO TARJETAS VALUES (ENCRYPTBYKEY(@KEYID, '12345'), GETDATE())
CLOSE SYMMETRIC KEY SYM_KEY


Para comprobar que se ha cifrado el registro:

SELECT * FROM TARJETAS

Para leer la información:

OPEN SYMMETRIC KEY SYM_KEY
DECRYPTION BY PASSWORD = 'my_pass'

SELECT CAST(DECRYPTBYKEY(NUMERO) AS VARCHAR(200))
FROM TARJETAS
CLOSE SYMMETRIC KEY SYM_KEY


CERTIFICADOS

Un certificado es un elemento que puede ser protegido a nivel de base de dato utilizando el estándar X.509, admitiendo los campos V1 de dicho estándar.
Un certificado es una sentencia cifrada de manera digital, que nos permite unir la clave pública con la identidad de la persona, dispositivo o servicio que tiene la clave pública.
Una de las mayores ventajas de usar estos certificados es que se libera a los Host de la tarea que establece el pssword para sujetos de forma individual. En ves de ellos, dicho Host establece una relación de confianza con el emisor de certificados.

Los certificados contienen, básicamente, la siguiente información:

  • Una clave publica.
  • Información que identifica al sujeto, como podría ser el mail y el nombre.
  • El periodo de validez, la fecha hasta la cual este certificado podría usarse.
  • La firma digital del emisor.
  • La información de identificación del emisor.


Entre las posibilidades que brindan los certificados están que se pueden cargar desde un ensamblado o bien desde un archivo que contenga, también crearlos desde SQL 2005.

Ejemplo:

Primero hay que crear el certificado:

USE CIFRADO
GO
CREATE CERTIFICATE CERTIFICADO1


ENCRYPTION BY PASSWORD = 'my_pass'
WITH START_DATE = '20090101',
EXPIRY_DATE = '20100101',
SUBJET = 'www.gogoframework.blogspot.com'


También se puede utilizar un archivo:

CREATE CERTIFICATE CERTIFICADO1
FROM FILE = 'C:\CERTIFICADO.CER'
WITH PRIVATE KEY (FILE = 'C:\CERTIFICADO.PVK'),
DECRYPTION BY PASSWORD = 'my_pass');
GO


Ahora vamos a insertar un registro:

DECLARE @CERTID INT
SET @CERTIID = CERT_ID('CERTIFICADO1')

INSERT INTO TARJETAS VALUES (ENCRYPTBYCERT(@CERTID, '12345'), GETDATE())
GO


Para comprobar el cifrado:

SELECT * FROM TARJETAS

Para poder leer los datos cifrados por certificados:

DECLARE @CERTID INT
SET @CERTID = CERT_ID('CERTIFICADO1')

SELECT CAST(DECRYPTBYCERT(@CERTID, NUMERO, CAST('my_pass' AS NVARCHAR)) AS VARCHAR(200))
FROM TARJETAS


Bueno, esas son las 4 formas que SQL Server 2005 nos permite utilizar para poder cifrar nuestros datos, recuerden que se debe utilizar para datos realmente importantes ya que el uso excesivo de estos cifrados pueden impactar en el rendimiento de nuestros sistemas.



Ailas………………………

0 comentarios:

Publicar un comentario