Etiquetas

, , , , ,

En SQL Server 2005 tenemos  4 alternativas para llevar a cabo  el cifrado de datos y son las siguientes:
Passphrase
En este método solo necesitamos pasar una contraseña que nos servirá para cifrar y descifrar los datos, para esto los comandos que se usaran serán EncryptByPassPhrase y DecryptByPassPhrase.

Sintaxis
EncryptByPassPhrase( { ‘passphrase’ | @passphrase } ,
{ ‘cleartext’ | @cleartext }
[ , { add_authenticator | @add_authenticator }
, { authenticator | @authenticator } ]
En la siguiente instrucción insertamos un registro en una tabla encriptando uno de los valores
INSERT INTO MiTabla
VALUES (ENCRYPTBYPASSPHRASE(‘$$Mipass$$’,’MisDatos’),’Masdatos’)
GO
Y de esta manera recuperamos los datos utilizando
DECRYPTBYPASSPHRASE
SELECT CONVERT(VARCHAR(300),
DECRYPTBYPASSPHRASE(‘$$ Mipass $$’,Micolumna))
FROM MiTabla
Claves Asimétricas (Asymmetric Key)
Con las claves asimétricas podemos proteger y encriptar los datos a nivel de la base de datos creando un objeto del tipo ASYMMETRIC KEY estos objetos contienen un clave privada (puede ser de 512,  1024 ó 2048 Bits ) y una publica.
Sintaxis

CREATE ASYMMETRIC KEY Asym_Key_Name
[ AUTHORIZATION database_principal_name ]
{
FROM <Asym_Key_Source>
|
WITH ALGORITHM = { RSA_512 | RSA_1024 | RSA_2048 }
}
ENCRYPTION BY PASSWORD = ‘password’
<Asym_Key_Source>::=
FILE = ‘path_to_strong-name_file’
|
EXECUTABLE FILE = ‘path_to_executable_file’
|
ASSEMBLY Assembly_Name
Para cifrar y descifrar, utilizamos EncryptByAsymKey / DecryptByAsymKey:

EncryptByAsymKey (Asym_Key_ID , { ‘cleartext’ | @cleartext } )
DecryptByAsymKey (
Asym_Key_ID ,
{ ‘ciphertext’ | @ciphertext }
[ , ‘Asym_Key_Password’ ]
)
Ejemplo
Creamos la ASYMMETRIC KEY:
CREATE ASYMMETRIC KEY ClaveAsym
WITH ALGORITHM = RSA_2048
ENCRYPTION BY PASSWORD =’$$Mipass$$’
GO
O también de esta forma si la tenemos en una archivo:
CREATE ASYMMETRIC KEY ASYM2
FROM FILE =’C:\LLAVE.KEY’
ENCRYPTION BY PASSWORD = ‘Mipass’
DECLARE @KEYID INT
SET @KEYID = AsymKey_ID(‘ClaveAsym’)
INSERT INTO Mitabla (Micolumna)
VALUES (EncryptByAsymKey(@keyid,’Misdatos’))
En el siguiente paso leeremos el dato de forma totalmente legible:
DECLARE @KEYID INT
SET @KEYID = AsymKey_ID(‘ClaveAsym’)

SELECT CAST(DecryptByAsymKey(@keyid, Micolumna,N’$$ Mipass’$$’) AS VARCHAR(100))
FROM Mitabla
Claves Simétricas (Symmetric Key)
Este método, utiliza una key tanto para el cifrado como para el descifrado de los datos. La clave simetrica puede ser cifrada de 4 distintas maneras: con certificado, con password, con clave simétrica o con clave asimétrica.
Sintaxis
CREATE SYMMETRIC KEY key_name [ AUTHORIZATION owner_name ]
WITH <key_options> [ , … n ]
ENCRYPTION BY <encrypting_mechanism> [ , … n ]
<encrypting_mechanism> ::=
CERTIFICATE certificate_name
|
PASSWORD = ‘password’
|
SYMMETRIC KEY symmetric_key_name
|
ASYMMETRIC KEY asym_key_name
<key_options> ::=
KEY_SOURCE = ‘pass_phrase’
|
ALGORITHM = <algorithm>
|
IDENTITY_VALUE = ‘identity_phrase’ <algorithm> ::=
DES | TRIPLE_DES | RC2 | RC4 | DESX
| AES_128 | AES_192 | AES_256
Para cifrar y descifrar, utilizamos utilizaremos EncryptByKey / DecryptByKey
EncryptByKey(key_GUID , { ‘cleartext’ | @cleartext }
[
, { add_authenticator | @add_authenticator }
, { authenticator | @authenticator }
]
)
DecryptByKey( { ‘ciphertext’ | @ciphertext }
[ , add_authenticator
, { authenticator | @authenticator }
]
)

Ejemplo
CREATE SYMMETRIC KEY SYM_KEY
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY PASSWORD =’##Mipass##’
DECLARE @KEYID UNIQUEIDENTIFIER
SET @KEYID = KEY_GUID(‘SYM_KEY’)
OPEN SYMMETRIC KEY SYM_KEY
DECRYPTION BY PASSWORD=’## Mipass ##’
INSERT INTO Mitabla  (Micolumna) VALUES
(ENCRYPTBYKEY(@KEYID,’MisDatos’))
CLOSE SYMMETRIC KEY SYM_KEY
Para el descifrado de los dato utilizaremos el siguiente código:
OPEN SYMMETRIC KEY SYM_KEY
DECRYPTION BY PASSWORD =’##Mipass##’
SELECT CAST(DECRYPTBYKEY(Micolumna) AS VARCHAR(200))
FROM Mitabla
CLOSE SYMMETRIC KEY SYM_KEY
Certificados
El Certificado se puede cargar desde  un archivo que contenga el certificado, o crear uno desde SQL 2005.
Sintaxis

CREATE CERTIFICATE certificate_name [ AUTHORIZATION user_name ]
{ FROM <existing_keys> | <generate_new_keys> }
[ ACTIVE FOR BEGIN_DIALOG =  { ON | OFF } ]
<existing_keys> ::=
ASSEMBLY assembly_name
| {
[ EXECUTABLE ] FILE = ‘path_to_file’
[ WITH PRIVATE KEY ( <private_key_options> ) ]
}
<generate_new_keys> ::=
[ ENCRYPTION BY PASSWORD = ‘password’]
WITH SUBJECT = ‘certificate_subject_name’
[ , <date_options> [ ,…n ] ]
<private_key_options> ::=
FILE = ‘path_to_private_key’
[ , DECRYPTION BY PASSWORD = ‘password’ ]
[ , ENCRYPTION BY PASSWORD = ‘password’ ]
<date_options> ::=
START_DATE = ‘mm/dd/yyyy’ | EXPIRY_DATE = ‘mm/dd/yyyy’
Para cifrar y descifrar, utilizamos utilizaremos EncryptByKey / DecryptByKey
EncryptByCert ( certificate_ID , { ‘cleartext’ | @cleartext } )
DecryptByCert (
certificate_ID ,
{ ‘ciphertext’ | @ciphertext }
[ , { ‘cert_password’ | @cert_password } ]
)

Ejemplo
CREATE CERTIFICATE MiCERTIFICADO
ENCRYPTION BY PASSWORD =’Mipas’
WITH START_DATE =’20100101′,
EXPIRY_DATE =’20110101′,
SUBJECT = ”
En caso de cargarlo desde un archivo:
CREATE CERTIFICATE MiCERTIFICADO
FROM FILE = ‘c:\certificado.cer’
WITH PRIVATE KEY (FILE = ‘c:\certificado.pvk’,
DECRYPTION BY PASSWORD = ’Mipas’);
GO
DECLARE @CERTID INT
SET @CERTID = CERT_ID(‘MiCERTIFICADO’)
INSERT INTO Mitabla(Micolumna)
VALUES (ENCRYPTBYCERT(@CERTID,’’MisDatos’))
GO
Para recuperar los datos insertados:
DECLARE @CERTID INT
SET @CERTID = CERT_ID(‘MiCERTIFICADO’)
SELECT CAST(DECRYPTBYCERT(@CERTID,Micolumna,CAST(’Mipas’ AS NVARCHAR)) AS VARCHAR(200))
FROM Mitabla