Este apartado contiene un ejemplo de sesión interactiva diseñada para mostrar cómo utilizar el cifrado de datos en las aplicaciones. Se han añadido comentarios para explicar cada operación.
-- Cifrado utilizando DB2eCLP -- -- Ésta es una sesión de cifrado de ejemplo utilizando el programa de -- interfaz de línea de mandatos de ejemplo suministrado, DB2eCLP. -- -- Sólo mostramos el código de retorno de una sentencia si ésta ha -- fallado; si ha finalizado satisfactoriamente, sólo mostramos los -- resultados de las selecciones. -- Los mandatos que se pueden escribir en DB2 Everyplace tiene por -- prefijo la serie "CLP:> ". -- -- -- (CLI:SQLConnect, SQL:CREATE TABLE, SQL:GRANT, SQL:REVOKE) -- -- Cuando se inicia DB2eCLP, automáticamente se conecta con -- la base de datos por omisión (en el directorio actual). -- Esto es equivalente a: -- CLP:> CONNECT TO anything; -- Puesto que no se indica ninguna vía de acceso específica, sólo -- el nombre "anything", conecta con el directorio actual. -- -- Ahora crearemos una tabla no cifrada que contenga una correlación -- de algunos números en palabras de contaje en sueco. CLP:> CREATE TABLE swedish(nummer INT, ord VARCHAR(32)); CLP:> INSERT INTO swedish VALUES(1, 'ett'); CLP:> INSERT INTO swedish VALUES(3, 'tre'); CLP:> INSERT INTO swedish VALUES(4, 'fyra'); CLP:> INSERT INTO swedish VALUES(5, 'fem'); CLP:> INSERT INTO swedish VALUES(7, 'sju'); CLP:> INSERT INTO swedish VALUES(99, 'nittionio'); -- Eche un vistazo a los datos CLP:> SELECT * FROM swedish; NUMMER ORD ----------- -------------------------------- 1 ett 3 tre 4 fyra 5 fem 7 sju 99 nittionio 6 row(s) returned. -- Ahora intentaremos crear la tabla correspondiente para inglés, -- pero utilizando cifrado. -- CLP:> CREATE TABLE english(number INT, word VARCHAR(32)) WITH ENCRYPTION; Statement failed [sqlstate = 42501]. -- Esta sentencia falla porque todavía no estamos autorizados, tal como ha -- indicado el código de error. Por tanto, tenemos que volver a conectar: -- CLP:> CONNECT TO something USER jsk USING hemligt; -- Este mandato conecta con la misma base de datos (directorio por -- omisión/actual) pero con una identidad de usuario específica "jsk" -- y utilizando la contraseña "hemligt". -- El mandato CONNECT TO no es una sentencia de SQL, por lo que lo -- interpreta la aplicación DB2eCLP. Ésta desconectará y conectará -- de nuevo con la base de datos DB2 Everyplace utilizando: -- SQLConnect(hdbc, "something", SQL_NTS, "jsk", SQL_NTS, "hemligt", SQL_NTS); -- -- Ahora, tenemos que crear el primer usuario autorizado. Cuando se crea -- el primer usuario, éste tiene que tener el mismo nombre y la misma -- contraseña que el usuario que ha iniciado la sesión: -- CLP:> GRANT ENCRYPT ON DATABASE TO "jsk" USING "hemligt" NEW "hemligt"; -- Observe que para GRANT es necesario que el nombre y las contraseñas -- estén entre comillas dobles. Esto es debido a que son sensibles a las -- mayúsculas y minúsculas y la sentencia se pasa directamente a DB2 Everyplace. -- -- Ahora que tenemos un usuario de cifrado autorizado, podemos crear -- la tabla cifrada: -- CLP:> CREATE TABLE english(number INT, word VARCHAR(32)) WITH ENCRYPTION; CLP:> INSERT INTO english VALUES(1, 'one'); CLP:> INSERT INTO english VALUES(3, 'three'); CLP:> INSERT INTO english VALUES(4, 'four'); CLP:> INSERT INTO english VALUES(5, 'five'); CLP:> INSERT INTO english VALUES(7, 'seven'); CLP:> INSERT INTO english VALUES(99, 'ninety nine'); -- Eche un vistazo a los datos. CLP:> SELECT * FROM english; NUMBER WORD ----------- -------------------------------- 1 one 3 three 4 four 5 five 7 seven 99 ninety nine 6 row(s) returned. -- Seleccione un número aleatorio elevado en sueco: -- CLP:> SELECT * FROM swedish WHERE nummer > 42; NUMMER ORD ----------- -------------------------------- 99 nittionio 1 row(s) returned. -- Seleccione un número aleatorio elevado en inglés: -- CLP:> SELECT * FROM english WHERE number > 42; NUMBER WORD ----------- -------------------------------- 99 ninety nine 1 row(s) returned. -- Traduzca 'fyra' al inglés: -- CLP:> SELECT word FROM swedish, english WHERE number = nummer AND ord = 'fyra'; WORD -------------------------------- four 1 row(s) returned. -- Obtenga una tabla de traducción: -- CLP:> SELECT number, ord, word FROM swedish, english WHERE number = nummer; NUMBER ORD WORD ----------- -------------------------------- -------------------------------- 1 ett one 3 tre three 4 fyra four 5 fem five 7 sju seven 99 nittionio ninety nine 6 row(s) returned. -- Intente autorizar a otra usuaria para que acceda a los datos cifrados -- con su propia contraseña: -- CLP:> GRANT ENCRYPT ON DATABASE TO "xin" USING "notKnown" NEW "notKnown"; Statement failed [sqlstate = 42506]. -- Esta sentencia ha fallado porque el usuario que ha iniciado la sesión -- se tiene que autovalidar para poder añadir un nuevo usuario; esto se -- hace proporcionando su contraseña detrás de la cláusula USING. -- CLP:> GRANT ENCRYPT ON DATABASE TO "xin" USING "hemligt" NEW "notKnown"; -- Volvamos a conectar con el nuevo usuario: -- CLP:> CONNECT TO samething USER xin USING notknown; Statement failed [sqlstate = 42505]. -- Esta vez falla porque la contraseña no es igual, por lo que no se -- generará la misma clave y se deniega el acceso. -- CLP:> CONNECT TO samething USER ksin USING notKnown; -- Esta vez no fallará porque el usuario ksin no existe y, por consiguiente, -- no intentamos autentificar el usuario. -- Sin embargo, si utilizamos SQLGetInfo podremos distinguir este caso del -- caso en que un usuario se ha autentificado satisfactoriamente. -- CLP:> SELECT * FROM swedish; NUMMER ORD ----------- -------------------------------- 1 ett 3 tre 4 fyra 5 fem 7 sju 99 nittionio 6 row(s) returned. -- La selección de datos no cifrados funciona bien, sin embargo los datos -- no cifrados no se pueden leer/actualizar a no ser que haya un usuario -- autorizado conectado: -- CLP:> SELECT * FROM english; Statement failed [sqlstate = 42501]. -- Conectar como el nuevo usuario, finalmente con nombre de usuario y -- contraseña correctos. -- CLP:> CONNECT TO samething USER xin USING notKnown; -- Verificar que estamos autentificados y podemos acceder a los datos. -- CLP:> SELECT * FROM english; NUMBER WORD ----------- -------------------------------- 1 one 3 three 4 four 5 five 7 seven 99 ninety nine 6 row(s) returned. -- Añadir otro usuario: -- CLP:> GRANT ENCRYPT ON DATABASE TO "thf" USING "notKnown" NEW "heimlich"; -- Listar los usuarios existentes actualmente: -- CLP:> SELECT username, grantorname FROM "DB2eSYSUSERS"; USERNAME GRANTORNAME ------------------- ------------------- jsk jsk xin jsk thf xin 3 row(s) returned. -- Volver a conectar como "jsk": -- CLP:> CONNECT TO itagain USER jsk USING hemligt; Statement completed successfully. -- Intento de cambiar la contraseña por "secret": -- CLP:> GRANT ENCRYPT ON DATABASE TO "jsk" USING "secret" NEW "secret"; Statement failed [sqlstate = 42506]. -- Ah, hemos fallado porque es necesario que suministremos primero -- nuestra contraseña antigua, y luego la nueva: -- CLP:> GRANT ENCRYPT ON DATABASE TO "jsk" USING "hemligt" NEW "secret"; -- Intentarlo con la nueva contraseña: -- CLP:> CONNECT TO itagain USER jsk USING secret; -- Asegurarnos de que podemos acceder a datos cifrados: -- CLP:> SELECT * FROM english; NUMBER WORD ----------- -------------------------------- 1 one 3 three 4 four 5 five 7 seven 99 ninety nine 6 row(s) returned. -- Vamos a eliminar el privilegio de cifrado de "xin": -- CLP:> REVOKE ENCRYPT ON DATABASE FROM "xin"; -- Listar los usuarios -- CLP:> SELECT username, grantorname FROM "DB2eSYSUSERS"; USERNAME GRANTORNAME ------------------- ------------------- jsk jsk thf xin 2 row(s) returned. -- Volver a conectar con el usuario que ahora no existe, sin errores. -- CLP:> CONNECT TO thedatabase USER xin USING idontknow; -- Intentar realizar operaciones de cifrado sin autorización: -- CLP:> SELECT * FROM english; Statement failed [sqlstate = 42501]. CLP:> DROP TABLE english; Statement failed [sqlstate = 42501]. CLP:> REVOKE ENCRYPT FROM "jsk"; Statement failed [sqlstate = 42601]. CLP:> GRANT ENCRYPT ON DATABASE TO "xin" USING "idontknow" NEW "idontknow"; Statement failed [sqlstate = 42502]. -- Conectar como "thf": -- CLP:> CONNECT TO thedatabase USER thf USING heimlich; -- Comprobar que podemos leer datos cifrados: -- CLP:> SELECT * FROM english; NUMBER WORD ----------- -------------------------------- 1 one 3 three 4 four 5 five 7 seven 99 ninety nine 6 row(s) returned. -- Vamos a eliminar el privilegio del usuario conectado: -- CLP:> REVOKE ENCRYPT ON DATABASE FROM "thf"; -- Asegurarnos de que ya no puede acceder a los datos: -- CLP:> SELECT * FROM english; Statement failed [sqlstate = 42501]. -- Si conectamos con la base de datos como el único usuario que queda, "jsk" -- CLP:> CONNECT TO thedatabase USER jsk USING secret; -- Eliminamos el usuario conectado, éste ya no puede acceder a los datos. -- Realmente, no hay manera de acceder a los datos cifrados de nuevo. -- CLP:> REVOKE ENCRYPT ON DATABASE FROM "jsk"; -- Asegurarnos de que no queda ningún usuario: -- CLP:> SELECT username, grantorname FROM "DB2eSYSUSERS"; USERNAME GRANTORNAME ------------------- ------------------- 0 row(s) returned. -- Ahora no debemos poder acceder a los datos cifrados. -- CLP:> SELECT * FROM english; Statement failed [sqlstate = 42501]. -- Y así concluye la sesión de ejemplo.
Tareas relacionadas