viernes, 9 de octubre de 2020

Diferencia entre Login (Inicio de Sesión) y Usuario en SQL Server

Un Inicio de Sesión (Login) representa la conexión a la Instancia de SQL Server. Un login es usado para la autenticación al servidor SQL Server. Dicha conexión debe ser validada por algún tipo de servidor de autenticación, de tal modo, que podemos encontrar Inicios de Sesión de Windows (la validación la realiza el Sistema Operativo, y representa al usuario contextual con el que hemos iniciado sesión en Windows) e Inicios de Sesión de SQL Server (la validación la realiza SQL Server, luego es el motor de base de datos quién debe almacenar la contraseña y quién debe validar al usuario).

En cualquier caso, un Inicio de Sesión definido en una Instancia puede pertenecer a determinadas Funciones de Servidor (Server Roles) de dicha Instancia, y cuya pertenencia suele conceder determinados privilegios en dicha Instancia de SQL Server (ej: pertenecer a BULKADMIN permite poder realizar cargas masivas en cualquier base de datos de la Instancia, siempre que además se tengan permisos sobre la tabla de destino).

Una cuenta de usuario (Usuarios de base de datos) es usada para la validación y permisos de acceso a los objetos de una base de datos (procedimientos almacenados, tablas, etc.). Un usuario se define a nivel de Base de Datos y se le asigna al inicio de sesión o login.

un Inicio de Sesión se almacena en la base de datos master (a nivel de la Instancia) y queda definido por su SID, mientras que los Usuarios se almacenan en cada Base de Datos particular y quedan definidos por su UID aunque tienen asignado el SID que les corresponda según el Inicio de Sesión al que pertenecen.

Creación de Login
CREATE LOGIN [LoginFinanciera] WITH PASSWORD = N'Protect2020'
GO

CREATE LOGIN [LoginFinanciera] WITH PASSWORD = N'Protect2020', DEFAULT_DATABASE=[FinancieraDemoBD]

-- creación de login desde Windows
CREATE LOGIN [LoginFinanciera] FROM WINDOWS WITH DEFAULT_DATABASE=[FinancieraDemoBD]

Asignación de Roles a Login
-- Agregar rol dbcreator al login
EXEC sp_addsrvrolemember 'LoginFinanciera', 'dbcreator'

Creación de Usuario de Base de Datos
USE FinancieraDemoBD
GO
 
CREATE USER [UsuarioBDFinanciera] FOR LOGIN [LoginFinanciera]
GO

-- conceder permisos al usuario para que realice Select sobre una tabla de la BD.
GRANT SELECT ON dbo.CLIENTE TO UsuarioBDFinanciera
GO

Eliminar Login y Usuario de Base de Datos
-- Eliminar Login y Usuario
drop login LoginFinanciera

drop user UsuarioBDFinanciera


Creación de Login y Usuario de Base de Datos, previa verificación de existencia

-- CREACION DE LOGIN
USE [master]
GO
IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = N'LoginFinanciera')
	CREATE LOGIN [LoginFinanciera] WITH PASSWORD = N'Protect2020', DEFAULT_DATABASE=[FinancieraDemoBD]

-- CREACION DE USUARIO DE BASE DE DATOS
USE [FinancieraDemoBD]
GO
IF NOT EXISTS(SELECT name FROM sys.sysusers WHERE name = 'UsuarioBDFinanciera')
	CREATE USER [UsuarioBDFinanciera] FOR LOGIN [LoginFinanciera]
GO


Asignación de Roles a Usuario de Base de Datos y otorgar permisos a objetos: procedimientos almacenados, tablas
-- ASIGNACION DE PERMISOS
EXEC sp_addrolemember N'db_datareader', N'UsuarioBDFinanciera'
GO
EXEC sp_addrolemember N'db_datawriter', N'UsuarioBDFinanciera'
GO	
GRANT EXECUTE TO [UsuarioBDFinanciera]

-- DAR PERMISOS AL USUARIO DE BASE DE DATOS SOBRE PROCEDIMIENTOS ALMACENADOS Y TABLAS
USE [FinancieraDemoBD]
GO
GRANT EXECUTE ON [spListar_Clientes] TO [UsuarioBDFinanciera];
GRANT EXECUTE ON [spInsertar_Cliente] TO [UsuarioBDFinanciera];
GRANT EXECUTE ON [spListar_Proveedor] TO [UsuarioBDFinanciera];
GRANT EXECUTE ON [spInsertar_Proveedor] TO [UsuarioBDFinanciera];

GRANT SELECT,INSERT,UPDATE,DELETE ON [CLIENTE] TO [UsuarioBDFinanciera];
GRANT SELECT,INSERT,UPDATE,DELETE ON [PROVEEDOR] TO [UsuarioBDFinanciera];
GRANT SELECT,INSERT,UPDATE,DELETE ON "dbo"."COLABORADOR" TO "UsuarioBDFinanciera";

-- PERMISO ESPECIAL --> EVALUAR CONSIDERACIONES DE SEGURIDAD
GRANT ALTER ON "dbo"."CLIENTE" TO "UsuarioBDFinanciera";

GO 


Consultar login y usuarios de base de datos

-- *** Ver los Inicios de Sesión de la Instancia de SQL Server ***
select sid, name, dbname, password, loginname
from master..syslogins


-- Ver los inicios de Sesion
select * from sys.server_principals


-- *** Ver los Usuarios de la Base de Datos actual de SQL Server ***
use FinancieraDemoBD
GO
select uid, name, sid, *
from sysusers
where islogin=1


select * from sys.database_principals


Posted by InfoTacticas Soluciones  |  No comments

10/09/2020 09:42:00 p. m. Share:

0 comentarios:

COPIA DE SEGURIDAD DE CLAVE SIMÉTRICA EN SQL SERVER

Las llaves simétricas deberían tener una copia de seguridad, pero lamentablemente esto no es posible debido a que dentro de las sentencias T-SQL para manejar las llaves simétricas no hay ninguna que sirva para sacar copias de seguridad, sin embargo hay dos atributos especiales que fueron especificados en la creación de la llave simétrica:
IDENTITY_VALUE: el cual SQL Server usa para generar in valor GUID para la llave.
KEY_SOURCE: el cual SQL Server usa como material para poder generar la llave en sí.
Si estos dos atributos fueron especificados en la creación de la llave simétrica, entonces esta podrá ser recreada siempre y cuando se tengan copias de seguridad de los objetos usados para generarla: el certificado usado.

Ejemplo de cómo sacar la copia de seguridad de la Master Key >y del Certificado los cuáles serán usados para recrear la creación de la llave simétrica.

USE FinancieraDemoBD
GO

-- sacaremos una copia de seguridad de la DMK
BACKUP MASTER KEY TO FILE = 'D:\BACKUP\PERSONAL\DMK.dat'
ENCRYPTION BY PASSWORD = 'TopSecret2020MK';
GO

-- Sacaremos una copia de seguridad del certificado
BACKUP CERTIFICATE FinancieraCertificado TO FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.cer'
WITH PRIVATE KEY ( FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.key' ,
ENCRYPTION BY PASSWORD = 'TopSecret2020C' );
GO

Ahora borraremos la llave simetrica, el certificado y la master key
DROP SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
GO

-- Ahora perderemos el certificado.
DROP CERTIFICATE FinancieraCertificado
GO

-- Ahora perderemos la DMK
DROP  MASTER KEY
GO


Al no tener la llave simetrica la informacion es inaccesible. Entonces, para recrear nuestra configuración, primero restauraremos la DMK, luego se abre la DMK para poder restaurar el certificado, luego se restaura el certificado y después se recrea la creación de la llave simétrica con el mismo valor de KEY_SOURCE y IDENTITY_VALUE .
RESTORE MASTER KEY
FROM FILE = 'D:\BACKUP\PERSONAL\DMK.dat'
DECRYPTION BY PASSWORD = 'TopSecret2020MK'
ENCRYPTION BY PASSWORD = 'TopSecret2020MKN'
GO

-- Ahora abrimos la DMK sino no podremos restaurar el certificado
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'TopSecret2020MKN'
GO

-- Ahora restauramos el certificado
CREATE CERTIFICATE FinancieraCertificado
FROM FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.cert'
WITH PRIVATE KEY (FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.key',
DECRYPTION BY PASSWORD = 'TopSecret2020C');
GO

-- Ahora recreamos la llave simetrica
CREATE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
WITH
KEY_SOURCE = 'ClaveSimetrica2020',
IDENTITY_VALUE = 'MiValorIdentidad',
ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE FinancieraCertificado
GO

A continuación se vuelve a consultar los datos usando el Certificado y la desencriptación por clave y volvemos a obtener la información desencriptada
OPEN SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC DECRYPTION BY CERTIFICATE FinancieraCertificado;

-- Ahora seleccionamos los datos pero antes los desencriptamos con la llave simetrica
SELECT MATRICULACOLABORADOR, CONVERT(VARCHAR(100),DECRYPTBYKEY(NOMBRES)) AS NOMBRES,
CONVERT(VARCHAR(100),DECRYPTBYKEY(APELLIDOS)) AS APELLIDOS
FROM dbo.COLABORADOR
/*
MATRICULACOLABORADOR	NOMBRES	APELLIDOS
CAR001	CESAR ANTONIO	AVILA ROBLES
*/

-- Y ahora volvemos a cerrar la llave simetrica
CLOSE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
Posted by InfoTacticas Soluciones  |  1 comment

10/09/2020 04:25:00 p. m. Share:

1 comentarios:

COPIA DE SEGURIDAD (BACKUP) DE CERTIFICADO EN SQL SERVER Y RESTAURACIÓN DEL CERTIFICADO

Los certificados deben tener una copia de seguridad como la base de datos misma debido a que en el caso de que perdamos el certificado solo esa copia de seguridad nos podrá asegurar la recuperación de toda la data encriptada con ese certificado, caso contrario, la información permanecerá perdida debido a que ya no se tiene el mismo certificado que la encriptó.
Breve Ejemplo de creación de certificado y registro de datos encriptados.
IF (DATABASEPROPERTY('FinancieraDemoBD','version') > 0)
BEGIN
USE MASTER
ALTER DATABASE FinancieraDemoBD SET single_user WITH ROLLBACK IMMEDIATE
DROP DATABASE FinancieraDemoBD
END


-- Creamos la Base de Datos de prueba
use master 
GO

create database FinancieraDemoBD
GO

-- Usamos la Base de Datos de Prueba
use FinancieraDemoBD
GO

-- Creamos una tabla cliente con las columnas Nombre y NombreCorto
-- de tipo varbinary para que contenga la informacion encriptada
CREATE TABLE [dbo].[CLIENTE](
	[IDCLIENTE] [int] IDENTITY(1,1) NOT NULL,
	[FECING] [datetime] NULL,
	[USUING] [varchar](6) NULL,	
	[FECACT] [datetime] NULL,
	[USUACT] [varchar](6) NULL,
	[NOMBRE] [varbinary](max) NOT NULL,
	[NOMBRECORTO] [varbinary](max) NULL,
PRIMARY KEY CLUSTERED 
(
	[IDCLIENTE] ASC
)
) ON [PRIMARY]

GO 



-- Crear una Database Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ClaveSecretaINFO2020'
GO

-- Crear el Certificado
CREATE CERTIFICATE FinancieraCertificado WITH SUBJECT='INFOTACTICAS Certificate',
EXPIRY_DATE = '20211231'
GO


-- Consultar los certificados creados en la base de datos
SELECT name, pvt_key_encryption_type_desc, subject, expiry_date
FROM sys.certificates
/*
name			pvt_key_encryption_type_desc	subject				expiry_date
FinancieraCertificado	ENCRYPTED_BY_MASTER_KEY		INFOTACTICAS Certificate	2021-12-31 00:00:00.000
*/


-- Insertar un valor
INSERT INTO dbo.CLIENTE (FECING, USUING, NOMBRE, NOMBRECORTO)
VALUES (getdate(), 'IRE001', ENCRYPTBYCERT(CERT_ID('FinancieraCertificado'),'CARLOS FLORES RIOS'), ENCRYPTBYCERT(CERT_ID('FinancieraCertificado'),'CARLOS FLORES'))
GO
-- Select convencional
SELECT IDCLIENTE, NOMBRE, NOMBRECORTO, FECING
FROM dbo.CLIENTE
/*
IDCLIENTE	NOMBRE			NOMBRECORTO		FECING
1		0xC118457BFAA...	0xEF308BFC78424F717...	2020-10-08 23:47:39.520
*/


-- Select desencriptando los datos con el certificado correcto
SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
FECING
FROM dbo.CLIENTE
/*
IDCLIENTE	NOMBRE			NOMBRECORTO	FECING
1		CARLOS FLORES RIOS	CARLOS FLORES	2020-10-08 23:47:39.520
*/

Ejemplo de cómo sacarle una copia de seguridad al certificado.
USE FinancieraDemoBD
GO

-- Sacar una copia de seguridad del certificado
BACKUP CERTIFICATE FinancieraCertificado TO FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.cer'
WITH PRIVATE KEY ( FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.key' ,
ENCRYPTION BY PASSWORD = 'TopSecretINFO2020' );
GO

Se borrará el certificado para simular su pérdida en escenarios donde se hace un backup de la base de datos y se restaurá en otro servidor y dicho certificado no se guardó con el backup.
-- Eliminar el certificado.
DROP CERTIFICATE FinancieraCertificado
GO


-- Podemos confirmar que nuestro certificado no esta y no podemos desencriptar nuestra informacion
SELECT name, pvt_key_encryption_type_desc, subject, expiry_date
FROM sys.certificates

SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
FECING
FROM dbo.CLIENTE

/*
IDCLIENTE	NOMBRE	NOMBRECORTO	FECING
1		NULL	NULL		2020-10-08 23:47:39.520
*/
Probaremos a crear nuevamente el certificado a ver si todo funcionara nuevamente.
-- Creamos el certificado
CREATE CERTIFICATE FinancieraCertificado WITH SUBJECT='INFOTACTICAS Certificate',
EXPIRY_DATE = '20211231'
GO

-- Probamos desencriptar la informacion
SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
FECING
FROM dbo.CLIENTE
/*
IDCLIENTE	NOMBRE	NOMBRECORTO	FECING
1		NULL	NULL		2020-10-08 23:47:39.520
*/
Sin embargo, no funcionó debido a que el certificado que se usó no es el mismo que encripto la información, a pesar de que se creó el certificado con la misma instrucción. Volveremos a eliminar el certificado y restaurarlo desde el backup.
-- Volvemos a eliminar el certificado
DROP CERTIFICATE FinancieraCertificado
GO

-- Ahora restauramos el certificado desde nuestra copia de seguridad
CREATE CERTIFICATE FinancieraCertificado
FROM FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.cer'
WITH PRIVATE KEY (FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.key',
DECRYPTION BY PASSWORD = 'TopSecretINFO2020');
GO

-- Finalmente volvemos a consultar la informacion
SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
FECING
FROM dbo.CLIENTE

La clave especificada en: DECRYPTION BY PASSWORD = 'TopSecretINFO2020' tiene que ser la misma que la especificada en: ENCRYPTION BY PASSWORD = 'TopSecretINFO2020' y no tiene que se la misma que se usó al crear la MASTER KEY en: CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ClaveSecretaINFO2020'

Posted by InfoTacticas Soluciones  |  No comments

10/09/2020 10:52:00 a. m. Share:

0 comentarios:

Encriptación de Datos en SQL SERVER

En los sistemas de información muchas veces se maneja data sensible que se requiere proteger para evitar que caigan en manos maliciosas, por ejemplo: nombre de un cliente, número de documento de identidad, número de cuenta de ahorros, número de tarjetas de crédito, dirección de correo, número de teléfono, etc. Para esto es conveniente tener la información encriptada dentro de la base de datos. SQL Server, a partir de la versión 2005, nos ofrece una variedad de formas para encriptar la información en la base de datos, entre las cuales tenemos:
  • Passphrase
  • Certificate
  • Symmetric Key
  • Asymmetric Key

Passphrase:
Esta es la forma más simple y básica de encriptación de datos que se puede tener en SQL Server. Lo único que se necesita para encriptar los datos es una frase o contraseña “segura”.
Ejemplo:
--
--
IF (DATABASEPROPERTY('FinancieraDemoBD','version') > 0)
BEGIN
USE MASTER
ALTER DATABASE FinancieraDemoBD SET single_user WITH ROLLBACK IMMEDIATE
DROP DATABASE FinancieraDemoBD
END


-- Creamos la Base de Datos de prueba
use master 
GO

create database FinancieraDemoBD
GO

-- Usamos la Base de Datos de Prueba
use FinancieraDemoBD
GO

-- Creamos una tabla cliente con las columnas Nombre y NombreCorto
-- de tipo varbinary para que contenga la informacion encriptada
CREATE TABLE [dbo].[PROVEEDOR](
	[IDPROVEEDOR] [int] IDENTITY(1,1) NOT NULL,
	[FECING] [datetime] NULL,
	[USUING] [varchar](6) NULL,	
	[FECACT] [datetime] NULL,
	[USUACT] [varchar](6) NULL,
	[NOMBRE] [varbinary](max) NOT NULL
PRIMARY KEY CLUSTERED 
(
	[IDPROVEEDOR] ASC
)
) ON [PRIMARY]
GO 



-- Insertar un valor
INSERT INTO dbo.PROVEEDOR (FECING, USUING, NOMBRE)
VALUES (getdate(), 'IRE001', ENCRYPTBYPASSPHRASE('ClaveSecretaIRE','ANDRES LARA FABIAN'))
GO
-- Select convencional
SELECT IDPROVEEDOR, NOMBRE, FECING
FROM dbo.PROVEEDOR
/*
IDPROVEEDOR		NOMBRE				FECING
1			0x01000000DC8...	2020-10-08 23:36:54.097
*/

-- Select con una frase incorrecta
SELECT IDPROVEEDOR, CONVERT(VARCHAR(100), DECRYPTBYPASSPHRASE('ClaveSecreta',NOMBRE)) as 'NOMBRE',
FECING
FROM dbo.PROVEEDOR
/*
IDPROVEEDOR	NOMBRE	FECING
1		NULL	2020-10-08 23:14:56.043
*/

-- Select con la frase correcta
SELECT IDPROVEEDOR, CONVERT(VARCHAR(100), DECRYPTBYPASSPHRASE('ClaveSecretaIRE',NOMBRE)) as 'NOMBRE',
FECING
FROM dbo.PROVEEDOR
/*
IDPROVEEDOR	NOMBRE				FECING
1		ANDRES LARA FABIAN		2020-10-08 23:14:56.043
*/



Certificate: Otra forma de encriptación de datos dentro de la base de datos SQL Server a través de certificados digitales los cuales pueden ser adquiridos en alguna de las entidades que los expiden. SQL Server también permite la creación de certificados “self-signed” los cuales permiten al usuario crear un certificado propio con una sentencia simple de T-SQL. Los certificados en SQL Server pueden estar encriptados por un password, o por la Database Master Key, la cual es la primera llave que se debe crear en la base de datos para que a partir de ésta se encripten los demás objetos. A través de los certificados se puede tener un poco más de seguridad ya que para poder usar un certificado es necesario tener permiso al mismo para poder utilizarlo.

Ejemplo completo de la creación de un certificado “self-signed” encriptado a partir de la Database Master Key y se mostrará la encriptación y desencriptación de la información con dicho certificado.

IF (DATABASEPROPERTY('FinancieraDemoBD','version') > 0)
BEGIN
USE MASTER
ALTER DATABASE FinancieraDemoBD SET single_user WITH ROLLBACK IMMEDIATE
DROP DATABASE FinancieraDemoBD
END


-- Creamos la Base de Datos de prueba
use master 
GO

create database FinancieraDemoBD
GO

-- Usamos la Base de Datos de Prueba
use FinancieraDemoBD
GO

-- Creamos una tabla cliente con las columnas Nombre y NombreCorto
-- de tipo varbinary para que contenga la informacion encriptada
CREATE TABLE [dbo].[CLIENTE](
	[IDCLIENTE] [int] IDENTITY(1,1) NOT NULL,
	[FECING] [datetime] NULL,
	[USUING] [varchar](6) NULL,	
	[FECACT] [datetime] NULL,
	[USUACT] [varchar](6) NULL,
	[NOMBRE] [varbinary](max) NOT NULL,
	[NOMBRECORTO] [varbinary](max) NULL,
PRIMARY KEY CLUSTERED 
(
	[IDCLIENTE] ASC
)
) ON [PRIMARY]

GO 



-- Crear una Database Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ClaveSecretaINFO2020'
GO

-- Crear el Certificado
CREATE CERTIFICATE FinancieraCertificado WITH SUBJECT='INFOTACTICAS Certificate',
EXPIRY_DATE = '20211231'
GO


-- Consultar los certificados que creados en la base de datos
SELECT name, pvt_key_encryption_type_desc, subject, expiry_date
FROM sys.certificates
/*
name			pvt_key_encryption_type_desc	subject				expiry_date
FinancieraCertificado	ENCRYPTED_BY_MASTER_KEY		INFOTACTICAS Certificate	2021-12-31 00:00:00.000
*/


-- Insertar un valor
INSERT INTO dbo.CLIENTE (FECING, USUING, NOMBRE, NOMBRECORTO)
VALUES (getdate(), 'IRE001', ENCRYPTBYCERT(CERT_ID('FinancieraCertificado'),'CARLOS FLORES RIOS'), ENCRYPTBYCERT(CERT_ID('FinancieraCertificado'),'CARLOS FLORES'))
GO
-- Select convencional
SELECT IDCLIENTE, NOMBRE, NOMBRECORTO, FECING
FROM dbo.CLIENTE
/*
IDCLIENTE	NOMBRE			NOMBRECORTO		FECING
1		0xC118457BFAA...	0xEF308BFC78424F717...	2020-10-08 23:47:39.520
*/


-- Select desencriptando los datos con el certificado correcto
SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
FECING
FROM dbo.CLIENTE
/*
IDCLIENTE	NOMBRE			NOMBRECORTO	FECING
1		CARLOS FLORES RIOS	CARLOS FLORES	2020-10-08 23:47:39.520
*/

-- Select desencriptando los datos con el certificado incorrecto 
SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificadoOTRO'),NOMBRE)) as 'NOMBRE',
CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
FECING
FROM dbo.CLIENTE
/*
IDCLIENTE	NOMBRE		NOMBRECORTO		FECING
1		NULL		CARLOS FLORES		2020-10-08 23:14:56.043
*/

También se mostrará como es que se debe dar permisos a un usuario para que este pueda ver la información encriptada por el certificado.
Creamos un Usuario de pruebas para seleccionar la información de la tabla desencriptándola con el certificado pero ejecutándolo domo el Usuario creado, en este caso la información sale como NULL debido a que no se le ha dado permisos al usuario creado para usar el certificado, por ello para hacer uso del certificado se debe tener el permiso de CONTROL sobre el certificado (GRANT CONTROL ON CERTIFICATE :: [FinancieraCertificado] TO [USUARIO_FINANCIERA]

--
-- Crear un usuario de prueba
CREATE LOGIN [UsuarioFinanciera] WITH PASSWORD = N'Financiera2020'
GO
CREATE USER [UsuarioFinanciera] FOR LOGIN [UsuarioFinanciera]
GO
GRANT SELECT ON dbo.CLIENTE TO [UsuarioFinanciera]
GO

-- Seleccionar la informacion con el certificado
EXECUTE AS USER = 'UsuarioFinanciera'
SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
FECING
FROM dbo.CLIENTE;
REVERT
/*
IDCLIENTE	NOMBRE	NOMBRECORTO		FECING
1	NULL	NULL			2020-10-08 23:47:39.520
*/

-- La informacion sale como NULL debido a que no se tiene 
-- permiso para usuar el certificado como el UsuarioFinanciera

-- Para hacer uso del certificado se debe tener el permiso
-- de control sobre el certificado. Ahora asignaremos ese permiso al UsuarioFinanciera
GRANT CONTROL ON CERTIFICATE::[FinancieraCertificado] TO [UsuarioFinanciera]
GO

-- Seleccionar de nuevo la informacion con el certificado
EXECUTE AS USER = 'UsuarioFinanciera'
SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
FECING
FROM dbo.CLIENTE;
REVERT
/*
IDCLIENTE	NOMBRE			NOMBRECORTO	FECING
1		CARLOS FLORES RIOS	CARLOS FLORES	2020-10-08 23:47:39.520
*/


Para conocer como crear copia de seguridad (BACKUP) de un certificado en SQL SERVER Y restaurarlo, visitar la siguiente entrada de mi blog:
http://infotacticassoluciones.blogspot.com/2020/10/copia-de-seguridad-backup-de.html

Simmetric Key (Clave Simétrica):
El principio de la encriptación a partir de llaves simétricas es que para encriptar y desencriptar la información se necesita la misma llave. Este tipo de encriptación es la más común. Para crear una llave simétrica, esta debe ser encriptada a partir de un certificado, de una llave asimétrica o de otra llave simétrica, lo cual nos brinda mayor seguridad porque el usuario deberá pasar por encima de todos estos métodos de encriptación para poder acceder a la llave que le permitirá encriptar o desencriptar la información.
A continuación, un ejemplo simple de encriptación de datos con clave simétrica.
IF (DATABASEPROPERTY('FinancieraDemoBD','version') > 0)
BEGIN
USE MASTER
ALTER DATABASE FinancieraDemoBD SET single_user WITH ROLLBACK IMMEDIATE
DROP DATABASE FinancieraDemoBD
END


-- Creamos la Base de Datos de prueba
use master 
GO

create database FinancieraDemoBD
GO

-- Usamos la Base de Datos de Prueba
use FinancieraDemoBD
GO

-- Creamos una tabla COLABORADOR con las columnas Nombres y Apellidos
-- de tipo varbinary para que contenga la informacion encriptada
CREATE TABLE [dbo].[COLABORADOR](
	[IDCOLABORADOR] [int] IDENTITY(1,1) NOT NULL,
	[MATRICULACOLABORADOR] [varchar](6) NOT NULL,
	[FECING] [datetime] NULL,
	[USUING] [varchar](6) NULL,	
	[FECACT] [datetime] NULL,
	[USUACT] [varchar](6) NULL,
	[NOMBRES] [varbinary](max) NOT NULL,
	[APELLIDOS] [varbinary](max) NOT NULL,
PRIMARY KEY CLUSTERED 
(
	[IDCOLABORADOR] ASC
)
) ON [PRIMARY]

GO 


-- Crear una Database Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ClaveSecretaINFO2020'
GO

-- Crear el Certificado
CREATE CERTIFICATE FinancieraCertificado WITH SUBJECT='INFOTACTICAS Certificate',
EXPIRY_DATE = '20211231'
GO


-- Consultar los certificados que creados en la base de datos
SELECT name, pvt_key_encryption_type_desc, subject, expiry_date
FROM sys.certificates
/*
name					pvt_key_encryption_type_desc		subject						expiry_date
FinancieraCertificado	ENCRYPTED_BY_MASTER_KEY				INFOTACTICAS Certificate	2021-12-31 00:00:00.000
*/
Para crear la llave simétrica
-- Creamos la llave simetrica
CREATE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
WITH
KEY_SOURCE = 'ClaveSimetrica2020',
IDENTITY_VALUE = 'MiValorIdentidad',
ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE FinancieraCertificado;
GO

-- Hacemos una consulta para visualizar las llaves simetricas de la base de datos
-- en este caso podemos observar 2: las cuales son la DMK y la llave simetrica creada
-- a partir del certificado.
SELECT name, algorithm_desc, create_date--, *
FROM sys.symmetric_keys
/*
name				algorithm_desc		create_date
##MS_DatabaseMasterKey##	AES_256	2020-10-08 23:45:00.460
FINANCIERA_KEY_SYMMETRIC	AES_256	2020-10-09 16:40:52.293

*/
Ahora procederemos a ingresar valores a nuestra tabla. Para esto debemos abrir la llave simetrica, insertar un valor y Una vez que se termino de encriptar los datos, se cierra la llave simetrica.
-- Abrir la llave simétrica
OPEN SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC DECRYPTION BY CERTIFICATE FinancieraCertificado;

-- insertamos un valor
INSERT INTO dbo.COLABORADOR (MATRICULACOLABORADOR, FECING, USUING, NOMBRES, APELLIDOS)
VALUES ('CAR001', getdate(), 'IRE001', ENCRYPTBYKEY(KEY_GUID('FINANCIERA_KEY_SYMMETRIC'),'CESAR ANTONIO'), ENCRYPTBYKEY(KEY_GUID('FINANCIERA_KEY_SYMMETRIC'),'AVILA ROBLES'))
GO

-- Una vez que se termino de encriptar los datos, se cierra la llave simetrica
CLOSE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC

-- Intentamos hacer un select convencional
SELECT MATRICULACOLABORADOR, NOMBRES, APELLIDOS
FROM dbo.COLABORADOR
/*
MATRICULACOLABORADOR	NOMBRES			APELLIDOS
CAR001			0x0034CE8C5...		0x0034CE8C5716...
*/
Para poder ver los datos debemos desencriptarlos con la llave simetrica, y para hacerlo debemos primero abrirla.
OPEN SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC DECRYPTION BY CERTIFICATE FinancieraCertificado;

-- Ahora seleccionamos los datos pero antes los desencriptamos con la llave simetrica
SELECT MATRICULACOLABORADOR, CONVERT(VARCHAR(100),DECRYPTBYKEY(NOMBRES)) AS NOMBRES,
CONVERT(VARCHAR(100),DECRYPTBYKEY(APELLIDOS)) AS APELLIDOS
FROM dbo.COLABORADOR
/*
MATRICULACOLABORADOR	NOMBRES		APELLIDOS
CAR001			CESAR ANTONIO	AVILA ROBLES
*/

-- Y ahora volvemos a cerrar la llave simetrica
CLOSE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC


Para probar la seguridad de la llave simetrica, creamos un usuario de prueba: UsuarioCAFinanciera y probamos seleccionar la informacion con la llave simetrica.

CREATE LOGIN [UsuarioCAFinanciera] WITH PASSWORD = N'Protect2020'
GO
CREATE USER [UsuarioCAFinanciera] FOR LOGIN [UsuarioCAFinanciera]
GO
GRANT SELECT ON dbo.COLABORADOR TO UsuarioCAFinanciera
GO

-- Probamos seleccionar la informacion con la llave simetrica
EXECUTE AS USER = 'UsuarioCAFinanciera'
OPEN SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC DECRYPTION BY CERTIFICATE FinancieraCertificado;
SELECT MATRICULACOLABORADOR, CONVERT(VARCHAR(100),DECRYPTBYKEY(NOMBRES)) AS NOMBRES,
CONVERT(VARCHAR(100),DECRYPTBYKEY(APELLIDOS)) AS APELLIDOS
FROM dbo.COLABORADOR
REVERT
Aparece un error porque el usuario no tiene permisos sobre la llave simetrica. Para poder hacer uso de la llave simetrica debemos tener el permiso de control sobre el certificado que la encripta y sobre la misma llave simetrica.
-- Ahora asignaremos ese permiso al UsuarioCAFinanciera
GRANT CONTROL ON CERTIFICATE::[FinancieraCertificado] TO [UsuarioCAFinanciera]
GO
GRANT CONTROL ON SYMMETRIC KEY::FINANCIERA_KEY_SYMMETRIC TO UsuarioCAFinanciera
GO

-- Probamos seleccionar la informacion con la llave simetrica
EXECUTE AS USER = 'UsuarioCAFinanciera'
OPEN SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC DECRYPTION BY CERTIFICATE FinancieraCertificado;
SELECT MATRICULACOLABORADOR, CONVERT(VARCHAR(100),DECRYPTBYKEY(NOMBRES)) AS NOMBRES,
CONVERT(VARCHAR(100),DECRYPTBYKEY(APELLIDOS)) AS APELLIDOS
FROM dbo.COLABORADOR
CLOSE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
REVERT
/*
MATRICULACOLABORADOR	NOMBRES	APELLIDOS
CAR001	CESAR ANTONIO	AVILA ROBLES
*/
Ahora la informacion si aparece.

Para conocer como crear copia de seguridad (BACKUP) de un clave simétrica en SQL SERVER Y restaurarlo, visitar la siguiente entrada de mi blog: https://infotacticassoluciones.blogspot.com/2020/10/copia-de-seguridad-de-clave-simetrica.html

Referencias:
https://dbamemories.wordpress.com/2011/10/14/encriptacion-de-datos-en-sql-server-%e2%80%93-parte-3/
Posted by InfoTacticas Soluciones  |  No comments

10/09/2020 09:04:00 a. m. Share:

0 comentarios:

Get updates in your email box
Complete the form below, and we'll send you the best coupons.

Deliver via FeedBurner
back to top