Surviving the Night

El blog de Pablo Doval sobre .NET, SQL, WinDbg...

Paranoid: Cifrado de Datos en SQL Server 2005

Los DBAs son criaturas paranoicas. No, en serio, los amo de corazón, pero son la cosa más desconfiada que hay en el mundo; y si no lo es el DBA, lo será su jefe, o el jefe de su jefe, o alguien en su línea de reporte directo que considera que la seguridad de su empresa (ya sea ésta un Banco internacional o la Agrupación de Tamborileros y Triangulistas Amateur de Cerecinos de Campo) es crítica y de mayor importancia. Qué curioso, sobre todo si tenemos en cuenta su reticencia innata para actualizar de nivel de Service Pack, o para tener una cuidadosa política de permisos en el servidor que minimicen los riesgos de los ataques de inyección SQL, que no nos engañemos, si bien la vulnerabilidad de una inyección SQL la pone en bandeja el desarrollador, su explotabilidad viene determinada por la configuración y administración de la misma. Aquí estamos todos en el mismo barco, o como diría el gran Fran Peula, "Aquí, o f******* todos o la p*** al rio" :)).

Hoy he tenido un momento flashback. Como algunos de vosotros sabéis, hasta hace poco trabajaba en Microsoft dando soporte a SQL Server, y hoy me he acordado de dos clientes en particular. Uno de ellos, un chico gallego muy majo, de una empresa de desarrollo de La Coruña, que llamo a soporte de Microsoft porque habían sufrido una corrupción en uno de sus archivos de datos y era un tema crítico para ellos. La verdad es que trabajamos muy bien en ese caso; esfuerzos por los dos lados, nos quedamos bastante más tarde del horario establecido, y además hubo mucha suerte porque se pudo recuperar lo que necesitaban. Al final de la llamada, tras la recuperación de los datos, pude oír como pocas veces risas de satisfacción de éste chico y sus compañeros, se les notaba el tremendo alivio en todas las palabras de agradecimiento (realmente esa parte del trabajo era impagable... :_) ) y ¡¡¡hasta su compañero 'linuxero' alabó el producto y la calidad del soporte!!! ¿Creéis que me he acordado de él por todo esto? Pues no, me acordé de él porque tenía hambre, estoy en La Coruña y me prometió una mariscada xDDD Realmente no es el momento, porque no tengo casi nada de tiempo libre, pero la próxima vez que venga le llamaré; yo pondré las cervezas.

El otro cliente si tiene que ver con la parrafada inicial. Se trata de un chico de UK, un tal Greg, que estaba planeando el despliegue de una nueva aplicación, destinada a ser usada con SQL Server 2005, y que iba a contener información muy sensible. Lo que éste chico me preguntaba era básicamente si se podían cifrar los datos de una columna de SQL Server de tal modo que solo un usuario especial pudiera acceder a ellos, impidiendo el acceso a todos los demás usuarios, incluidos los sysadmin. Lo recordaré siempre porque fue mi primer caso con SQL Server 2005... ¿Veis? En el fondo soy un romanticón :)

Como me parece un tema interesante me gustaría compartir con vosotros una versión light del resumen que le hice, que a su vez estaba basada en dos geniales artículos de la MSDN, ya que estoy seguro que muchos de vosotros lo encontrareis útil tanto a nivel de desarrollo como de consultoría, etc. 

Cifrado de Datos en SQL Server Dosmilcinc... Yukon

Como suele suceder, escoger el nivel de protección adecuado consiste en buscar el balance entre la seguridad y la usabilidad (en el sentido de lo que se complique el empleo y administración de la base de datos). Para tomar esta decisión, primeramente debemos determinar de quien queremos proteger nuestros datos. Para ello vamos a considerar tres niveles de protección básicos:

  • Nivel 2: Protección frente a atacantes que pueden acceder a los ficheros físicos de la base de datos.
  • Nivel 1: Nivel 2 + protección frente al Sysadmin
  • Nivel 0: Nivel 1 + protección frente al propietario de la base de datos (dbo)

Ahora voy a proceder a explicar la aproximación que deberíamos tomar para securizar nuestros datos sensibles en cada uno de esos niveles, desde el más seguro (Nivel 0) hasta el menos seguro, pero más usable (Nivel 2).

Todos estos niveles se basan en el hecho de que los datos sean protegidos por una clave simétrica, ya que es la manera más eficiente de cifrar los datos, pero emplean diferentes mecanismos para proteger ésta clave simétrica. A partir de aquí surgen las diferencias:

            Nivel 0: Solo el usuario autorizado puede ver sus datos

Para lograr este grado de protección de nuestros datos, la clave simétrica debe ser protegida por una clave que solo será conocida por el usuario que ha cifrado los datos. Éste es el modo más seguro, ya que no hay manera en la cual el propietario de la base de datos, o el sysadmin, puedan acceder a la clave simétrica, ya que ésta no está almacenada en el servidor.

Los ficheros de datos se aseguran de este modo también, ya que aún en el supuesto de que un atacante consiga obtener acceso a los ficheros y adjuntarlos a su servidor, no podrá acceder a las columnas cifradas mientras no tenga a su disposición la contraseña de cifrado de la clave simétrica.

Evidentemente, hay una seria contrapartida en términos de usabilidad: para acceder a estos datos, necesitamos asegurarnos de que la clave sea abierta, y para ello debemos suministrar explícitamente la clave con la que se cifró la clave simétrica.

Podemos comprobar en cualquier momento las claves abiertas en una sesión dada simplemente echándole un vistazo a la vista de administración del sistema sys.open_keys. Si la clave no estuviera abierta, entonces la siguiente sentencia DDL sería necesaria para abrirla:

OPEN SYMMETRIC KEY <nombre_clave> DECRYPTION BY PASSWORD = ‘<contraseña>’

            Nivel 1: Otorgándole acceso al DBO

En éste escenario suponemos que el propietario de la base de datos es de fiar y puede tener acceso a las columnas sensibles, de modo que nos podemos permitir relajar un poco las restricciones de seguridad; lo que haremos en este caso es proteger la clave simétrica con un certificado (o una clave asimétrica). La clave privada del certificado (o de la clave asimétrica) necesita ser protegida por la Database Master Key o llave maestra de la base de datos. Para lograr esto en el momento de creación del certificado, debemos simplemente omitir la opción ENCRYPTION BY PASSWORD:

CREATE CERTIFICATE cert WITH SUBJECT = ‘EncryptionCert’

Si ya disponemos de un certificado existente (o clave asimétrica) protegido por una contraseña, y queremos que la protección la realice la Database Master Key, deberemos alterar éste certificado. Me gustaría recalcar aquí que la sintaxis para esta labor puede parecer muy poco intuitiva, así que como siempre, en caso de duda deberemos recurrir a los Books On Line del producto.

ALTER CERTIFICATE cert WITH PRIVATE KEY DECRYPTION BY PASSWORD = ‘<password>’

Y aquí viene la parte importante, el momento donde realmente protegemos los datos del sysadmin. El usuario dbo, o el usuario con privilegios, debe asegurarse de que la Database Master Key esté protegida solo mediante una contraseña. En el momento de creación de ésta Database Master Key se establece que, por defecto, sea cifrada por la Service Master Key, de modo que debemos eliminar ésta protección con una sentencia DROP como la siguiente:

ALTER MASTER KEY DROP ENCRYPTION BY SERVICE MASTER KEY

De éste modo, el propietario de la base de datos tiene acceso a los datos del usuario privilegiado, ya que puede usar la Database Master Key para descifrar la clave privada en el certificado, de modo que pueda ser luego usada para abrir la clave simétrica y descifrar los datos protegidos. No obstante, estamos protegidos del sysadmin ya que no será capaz de abrir la Database Master Key sin la clave apropiada.

            Nivel 2: Otorgándole al Sysadmin acceso a los datos

En éste escenario vamos a confiar también en el usuario sysadmin; solo nos preocupa la posibilidad de que nuestros datos sean robados y queremos prevenir que los atacantes puedan acceder a los datos sensibles en caso de que se hagan con el fichero de datos y puedan adjuntarlo a su base de datos. 

Debemos cifrar los datos con una clave simétrica, y proteger ésta clave simétrica con un certificado (o clave asimétrica) tal y como vimos en el nivel 1 de protección. Éste ultimo certificado es protegido, como demostramos antes, por la Database Master Key.

La diferencia importante es que el propietario de la base de datos NO debería hacer un drop del cifrado de la Database Master Key por la Service Master Key. Es decir, debemos dejarlo tal como se crea por defecto, o bien, en caso de que haya sido modificado, volver a establecerla con la siguiente sentencia DDL:

ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY

El sysadmin, de éste modo, tendrá acceso a la Database Master Key y por tanto, a cualquier objeto cifrado por la misma. Esto, evidentemente, implica que los datos no están protegidos ni frente al propietario de la base de datos ni frente al administrador del sistema, pero hemos conseguido que los datos estén protegidos en el fichero de datos. De este modo, si alguien robara los ficheros de la base de datos y fuera capaz de adjuntarlos a su propio SQL Server, no sería capaz de leer los datos cifrados ya que no tiene acceso a la contraseña que cifra la clave simétrica, ni acceso a ninguna de las claves de la jerarquía que protege la clave simétrica.

En resumen, el empleo de la jerarquía de claves en SQL Server 2005 facilita las áreas administrativas y de programación ya que no necesitamos abrir explícitamente las claves usadas para proteger los datos. No obstante, si queremos una securización adicional de los datos, debemos escoger la altura en la jerarquía a partir de la cual queremos cifrar la clave con una clave simétrica. Esto nos permite aumentar dramáticamente la seguridad, a costa, como ya vengo comentandoos, de una mayor complejidad administrativa debido al hecho de tener que abrir y cerrar las claves manualmente.

Desde un punto de vista del rendimiento, es evidente que se producirá una sobrecarga en el sistema. No obstante, no podemos estimarla a priori, ya que depende inmensamente del algoritmo de cifrado empleado, así como de la cantidad de los datos.

Ejemplo

Os dejo aquí un ejemplillo que muestra algunos de los conceptos que os comenté en el breve artículo. Es un script SQL para ir ejecutando pasito a pasito, leyendo los comentarios. Espero que el cacharro este lo formatee medio bien.

CREATE DATABASE PruebaBaseDatosSegura

GO

USE PruebaBaseDatosSegura

-- Creamos una nueva tabla donde vamos a almacenar el nombre del empleado (no
-- cifrado) y el numero de la seguridad social del mismo. Vamos a cifrar el número de
-- la seguridad social durante la inserción, de modo que tenemos que tener esto en
-- mente cuando establezcamos el tipo de datos, que deberá ser un varbinary de
-- modo que pueda contener la cadena resultante por el algoritmo de cifrado.

CREATE TABLE empleados (emp_nombre varchar(50), nss varbinary(256) primary key clustered)

-- Ahora creamos la clave simétrica que vamos a usar para cifrar/descifrar los datos

CREATE SYMMETRIC KEY skey WITH ALGORITHM = triple_des ENCRYPTION BY PASSWORD = 'C1av3'

-- Ahora un fragmento interesante... debemos tener en mente que si queremos usar
-- una clave, debemos abrirla primero. Para abrir una clave debemos usar la sentencia
-- OPEN. La clave podría estar protegida por un certificado, por la “Service Master Key”,
-- por la “Database Master Key” o por una contraseña. En éste ejemplo, y para hacerlo
-- coincidir con el escenario en el cual queremos evitar que el propietario de la base de
-- datos y el sysadmin puedan acceder a los datos, debemos suministrar la contraseña
-- en la sentencia open.

OPEN SYMMETRIC KEY skey DECRYPTION BY PASSWORD = 'C1av3'

-- Vamos a insertar ahora algunos valores, usando la función encryptbykey() para generar
-- un stream cifrado de la cadena que le pasamos como parámetro.

INSERT INTO empleados values ('Tom', encryptbykey(key_guid('skey'), '111-11-1111'))
INSERT INTO empleados values ('John', encryptbykey(key_guid('skey'), '222-22-2222'))
INSERT INTO empleados values ('Bob', encryptbykey(key_guid('skey'), '333-33-3333'))

-- Si ahora hacemos la select, podemos ver que el campo nss contiene solo un stream de
-- bytes ilegible.

SELECT * FROM empleados

-- Para poder leer los datos, necesitamos convertir desde el varbinary donde almacenamos
-- los datos, al tipo de datos de destino deseado, en este caso, varchar.

SELECT CONVERT(varchar(256), decryptbykey(nss)) FROM empleados

-- En el SSMS, usamos Ctrl-L o desde el menu: Query\Display Estimated Execution Plan,
-- para comprobar el plan de ejecución estimado. Podemos ver que se realiza un descifrado
-- por cada fila escaneada.

SELECT CONVERT(varchar(256), decryptbykey(nss)) FROM empleados WHERE CONVERT(varchar(256), decryptbykey(ssn) ) = '111-11-1111'

-- ... a ver que pasa con la clave cerrada...

CLOSE SYMMETRIC KEY skey
GO
SELECT CONVERT(varchar(256), decryptbykey(nss)) FROM empleados

-- Limpieza final... Ahora borramos la base de datos de ejemplo

USE Master
DROP DATABASE PruebaBaseDatosSegura

Como se puede ver en el ejemplo, cada vez que queremos acceder a un campo cifrado debemos descifrarlo con una función, y después hacer un cast al tipo de datos deseado. Esto tiene un impacto sobre el rendimiento de la aplicación, pero es algo que deberíamos medir y probar en nuestros sistemas.

Respecto a los aspectos de seguridad, obviamente esta implementación es mucho más robusta de lo que nunca haya sido SQL Server 2000, pero eso no quiere decir que podamos descansar tranquilos simplemente por utilizar las características criptográficas del producto. Hay otros modos de atacar los datos; por ejemplo, si el administrador de la base de datos quisiera acceder a los mismos de modo no autorizado y fuera suficientemente hábil, podría recurrir a múltiples trucos para obtener los datos; desde sniffers para capturar contraseñas a ataques de fuerza bruta, pasando por el empleo malintencionado de un depurador sobre el producto.

Con esto quiero haceros consciente de que la seguridad no es solo un asunto de cómo almacenemos los datos; todos los detalles del entorno juegan su papel. Desde la configuración de permisos de Windows, al almacenamiento físico de los datos, todo ha de ser tenido en cuenta.

Ya terminoooo...

Me gustaría terminar con una reflexión que le hacía a Greg cuando estaba decidiendo su implementación final: a simple vista parece que la opción de cifrar con una clave que no se almacene en el SQL Server y solo conozca una persona parece la más segura, pero como un día el propietario de esta clave sea atropellado por el camión de los pollos(tm), abducido por los Vogones, o se vaya a cenar al Restaurante del Fin del Mundo nos podemos olvidar de todos los datos que estuvieran cifrados con su clave. Así de crudo.

Posted: 24/11/2006 0:41 por Pablo Alvarez | con 16 comment(s) |
Comparte este post:

Comentarios

hnsortega ha opinado:

Gracias. Me ha sido de utilidad para rendir el Net Protector con total confianza. Saludos

# January 12, 2007 8:14 PM

Pablo Alvarez ha opinado:

Me alegro!! :)

# January 12, 2007 8:39 PM

Pablo Alvarez ha opinado:

Ahh.. por cierto, gracias por leer el post, creo que has sido el único xDD La proxima vez prometo enrollarme menos e ir mas directo al grano :P

# January 12, 2007 8:40 PM

alejandro ha opinado:

muchas gracias señor pablo por darnos tan buena informacion de primera linea de tiro ;-)

tener un empleado de soporte de microsoft que ponga post es un lujo.

hasta ahora no habia encriptado datos por el hecho de que mis bases de datos estaban solo en mi pc,pero ahora las estoy haciendo publicas.

la cuestion es que sqlserver 2005 tiene muchas funciones de encriptacion  y eso... pero, microsoft será seguro?

no me refiero a nivel de sqlserver, sino del sistema en general...

porque no me fio un pelo. Mis bases de datos están en un servidor 2003 server, supuestamente está bien mantenido con sus parches y la leche, pero el hecho de la mala fama que tiene microsoft de programar sus sistemas operativos hace que no me fie de lo que tengo en internet publico.

por eso me me desviado a sistemas linux al estilo de mysql.

no sé si mysql tiene funciones de encriptacion a este estilo y nivel, supongo que a estas alturas si.... pero no he leido nada todavia por gandul.

lo que quiero decir con esto es lo siguiente:

de que coño sirve encriptar datos para los sysadmin y todo eso si  luego llega un listillo y no es que te robe los datos, sino que te explota el buffer y cambia las contraseñas de todo y ahora te quedas con los huevos al aire??????

mysql por supuesto que tambien tiene fallos, pero he administrado los dos, y me quedo con mysql un rato mas que con ningun sqlserver.

ahora me toca mamarmela porque quiero implementar una base de datos rapidamente y necesito total integracion  con visual studio.net, ya que el mysql se integra con los componentes .net pero tienes que hacerlo todo a mano."desde rellenar un combo hasta enlazar un datagrid.... :-(  "

nada mas, solo felicitarte por los datos que nos has dado, esto de microsoft da pasta pero no me fio tavio.

chao

# September 12, 2007 3:26 PM

Pablo Alvarez ha opinado:

Hola Alejandro.. disculpa la tardanza en responder a tu mensaje. Tomo nota de tus comentarios, pero evidentemente no comparto la mayor parte de ellos.

Si quieres tener una aproximación a la seguridad en entornos Windows y contrastarla con otros sistemas operativos, te recomiendo que te hagas con una copia de los siguientes libros:

- Windows Internals (4th Edition) [Russinovich y Solomon]

- Writing Secure Code (2nd Edition) [Howard y LeBlanc]

Por otra parte, si tienes miedo a que te, como tu dices, "te llegue un listillo y te explote el buffer", date una vuelta por bugtrack a ver cuantos buffer overflows te encuentras en otras plataformas no Windows :)

En fin, lamentablemente hace años que descubri que en la informatica hay determinadas guerras de religion que es imposible ganar, por lo que no voy a intentar convencer a nadie que que los sistemas Windows son los mas robustos del mundo; lo que si haré será decir como me tomo yo nuestro mundo de la informatica... para mi todo son juguetes, y estoy dispuesto a jugar con todos :)

Un saludo!

# December 19, 2007 10:59 PM

Tatiana ha opinado:

Saludos a todos,

Respecto a la paranoia se Seguridad, tengo otro requerimiento Similar, ¿Como puedo proteger una BD en SQL Server, de modo que si se lleva a otra máquina no se pueda abrir siquiera, osea, menos leer o escribir directamente desde SQL Server, sino solo desde la aplicación a la q asiste?, Gracias a Pablo si le da tiempo para responder esta duda :)

# March 12, 2008 10:07 PM

Pablo Alvarez ha opinado:

Disculpa Tatiana, que no di cuenta de tu mensaje hasta hoy... no debí de darme cuenta de la notificacion de tu comentario.

No entiendo muy bien tu pregunta; si quieres exponer los datos de tu base de datos SQL Server, pues evidentmente el propio motor de base de datos (SQL Server) debe de tener acceso a ella. Otra cosa son las herramientas de administracion, como en Management Studio. Si es a eso a lo que te refieres, si que podrias evitar que un usuario concreto, o un conjunto, vieran las bases de datos con el management studio.

# June 12, 2008 11:45 AM

Luys ha opinado:

Hola Sr. Pablo, gracias por el blog.

Me preguntaba lo siguiente:

¿Què tan bueno (o seguro) sería encriptar los datos en la misma aplicación y luego almacenarlos en el servidor? Me refiero a usar por ejemplo Rijndael con una clave almacenada en el programa y luego enviar los datos al servidor para ser almacenados en campos adecuados como varbinary... Luego se ofusca el programa para evitar que alguien mal intencionado descompile el software o algo así y obtenga la llave... ¿Qué opinas?

# February 2, 2009 1:17 PM

Pablo Alvarez ha opinado:

Hola Luys,

  La aproximacion que propones no es que sea poco segura; ¡en muchos escenarios es perfectamente valida! Pero hay que analizar los escenarios en cuestion.

  Te comento que la razon principal del cifrado de datos del que hablaba en este post en su día es el tener un mecanismo de gestion de claves en el propio servidor, de modo que la seguridad de un usuario de base de datos concreta, o un login, dependa de sus certificados, passphrases, etc.. y en función del usuario/login concreto, dejar a SQL Server que gestione 'automáticamente' que datos deben de ser visibles y que datos no.

  En tu propuesta de mecanismo, es tu aplicacion la que cifra y descifra los datos, y por ende, si necesitas cifrados diferentes y claves diferentes para cada usuario de tu aplicacion, debes de contemplarlo en tu código. En el escenario que te expongo, es SQL Server el que lo gestiona, integrando el cifrado en el security stack de SQL Server.

  ¿Es mejor tu propuesta o 'la mia'? Pues como siempre, depende de los escenarios concretos y particulares :)

  Por cierto, y saliendonos de topic y del mundo de SQL Server, lo de ofuscar el programa no suele servir para nada... piensa que en algun momento tu información no cifrada esta en memoria en tu aplicación cliente; ese es el sweet spot preferido para atacar, adjuntando un depurador, o aprovechandose del fichero de paginación/hibernado, nos podemos hacer con un segmento de memoria donde esta el vaor que nos interesa sin cifrar, en tiempo de ejecución.

# February 2, 2009 1:29 PM

Luys ha opinado:

Muchas gracias por su amable respuesta! Tal y como usted lo ha dicho, hay que analizar las nesecidades particulares.

Por otro lado, y ahora que lo dice, ¿qué se podrá hacer contra esos ataques que usted menciona? ¿Servira de algo aplicar IDiposable o Dispose a los tipos y objetos creados? (disculpe la salida del tema...)

Gracias!

# February 2, 2009 1:44 PM

Pablo Alvarez ha opinado:

No te preocupes Luys, me encantan estas salidas de tema ;)

Lo que se puede lograr con esos ataques es acceder a la información secreta en memoria antes de ser cifrada. Lo del Dispose es una buena idea, pero lamentablemente no vale; recuerda que el recolector de basura de .NET no es determinsta. Tu puedes invocar explicitamente el código del dispose, pero eso no hara que la referencia al objeto (por ejemplo, un string con un valor secreto) desaparezca imediatamente.. esperará a que pase el GC, y puede que ni con esas se lleve la información en primera pasada.

La idea para cifrar este tipo de elemento y asegurarse que se liberan al dejar de usarlos (a través del Dispose) sería trampear un poco la creación del objeto. Un ejemplo seria el siguiente:

class DatosSecretos : IDisposable

{

  private byte[] secreto;

  private GCHandle handleDatos;

  public byte[] Datos

  {

     set

     {

        handleDatos = GCHandle.Alloc(secreto, GCHandleType.Pinned);

        byte[] datos = value;

        Array.Copy(datos, secreto, datos.Length);

     }

     get

     {

        return secreto;

     }

  }

  public DatosSecretos(int tamaño)

  {

     secreto = new byte[tamaño];

  }

  public void Dispose()

  {

     Array.Clear(secreto, 0, secreto.Length);

     handleDatos.Free();

  }

}

La idea es la siguiente:

- Obligamos a que la reserva de memoria sea 'pinned', es decir, ese objeto no se pueda mover en memoria a pesar de que suceda un recoleccion de basura y una compatación del managed heap.

- A través del handle a esa posición de memoria, al final de la ejecuión podemos, mediante el Dispose, liberar la memoria 'manualmente'.

Como ves, es hacer un poco de trampa, y no podemos abusar de ello, pues crear muchos objetos pinned podria fragmentar excesivamente la memoria.

Espero te sirva esta aproximacion!

# February 2, 2009 1:54 PM

Luys ha opinado:

Muchas gracias por la orientación y el código Pablo!!! Haré la prueba y luego le aviso. Saludos!

# February 2, 2009 2:00 PM

Pablo Alvarez ha opinado:

De nada, ¡gracias a ti por recordarme este hilo! :)

# February 2, 2009 2:02 PM

Adal ha opinado:

Hola que tal, tu ejemplo es muy bueno. Estoy implementando una sección de cifrado y tu artículo me ha ayudado bastante.

Ahora bien tengo una duda (o mas bien mucha paranoia). Te voy a plantear como es que lo voy a implementar.

En un SP voy a abrir y cerrar la llave y con dos funciones que creadas voy Encriptar y Desencriptar respectivamente. El SP y las funciones van a estar encriptadas.

La forma en que lo voy a usar es:

EXEC SP_Key 1--SP que abre la llave

Select [...] --Mando a llamar las funciones de Encriptado y Desencriptado

EXEC SP_Key 2--SP que cierra la llave

Ahora el punto es: si alguien logra colarse a la base de datos facilmente puede rastrear los SPs en donde utlice la encriptación y desencriptar los campos.

Que tan facil es que una aplicación expuesta a Internet, se logre colar un hacker y tener acceso a todos los objetos de la DB.

Saludos!!!

# April 28, 2009 10:22 PM

Carlos ha opinado:

Hola sr. Pablo

Tengo la misma pregunta que viviana. Hay manera de evitar que alguien deteniendo el servicio de SQL extraiga la base de datos y la anexe a otro servidor y la abra. Es decir, hay alguna forma en que solo el programador del sistema y por supuesto su programa pueda acceder al contenido de la base de datos sql?

# April 3, 2010 3:48 AM

Douglas ha opinado:

Como estas de antemando agradesco por este post, esta muy bueno, simplemente una consulta yo en estos momentos estoy cifrando una base que ya esta creado y con datos, los métodos de cifrados y procedimiento sale todo OK, el problema es que esas columnas cifradas también son utilizadas por unas vistas y cuando intento utilizar el método de descifrar dentro de la vista tengo un error, agradesco sus comentarios y ayuda

Saludos

# June 9, 2010 9:38 PM