Cifrado utilizando el DB2eCLP

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