IBM PureData System for Analytics, Version 7.1

Funciones encrypt() y decrypt()

Las funciones encrypt() y decrypt() descifran o cifran la entrada varchar o nvarchar utilizando la clave proporcionada.

Cifrado es el proceso de transformar los datos para mantener su confidencialidad; los datos solo podrán leerse (descifrar) si el destinatario tiene la clave necesaria. La implementación de IBM® Netezza utiliza cifrado simétrico, también conocido como cifrado privado o de clave secreta, porque la misma clave secreta se utiliza para cifrar y descifrar datos. Esto significa que esta clave secreta debe ponerse a disposición de cualquier servidor que descifre datos cifrados con anterioridad. Puede elegir qué algoritmo de cifrado simétrico utilizará la función para cifrar o descifrar los datos: Estándar de Cifrado Avanzado (AES) o RC4.

El cifrado de clave privada es más seguro que el cifrado de clave pública porque todos los esquemas de cifrado de clave pública son susceptibles a los ataques de búsqueda de claves por la fuerza bruta. Sin embargo, el cifrado de clave privada depende del mantenimiento de la confidencialidad de la clave, por lo que deberá cambiarla cada cierto tiempo y adoptar medidas para asegurarse de que no pueda descubrirse cuando se utilice, almacene o distribuya. (consulte la descripción del argumento key más adelante en el tema relativo a las recomendaciones de seguridad específicas de Netezza).

Nota: Este cifrado es a nivel de campo, no de base de datos.

Descripción

La función encrypt() tiene la siguiente sintaxis:
varchar = encrypt(varchar text, varchar key [, int algorithm 
          [, varchar IV]]);
nvarchar = encrypt(nvarchar text, nvarchar key [, int algorithm 
          [, varchar IV]]);
La función decrypt() tiene la siguiente sintaxis:
varchar = decrypt(varchar text, varchar key [, int algorithm 
          [, varchar IV]]);
nvarchar = decrypt(nvarchar text, nvarchar key [, int algorithm
          [, varchar IV]]);

El valor text especifica el valor que se va a cifrar o descifrar.

El valor key especifica la clave que se va a utilizar para cifrar/descifrar el valor. Deben tomarse precauciones para asegurarse de que la clave, o la seguridad en última instancia, no se vean comprometidos. Tenga presente la arquitectura del sistema Netezza al diseñar el sistema de seguridad:
  • Las funciones SQL se registrar en el archivo pg.log del host de Netezza por lo tanto, si se ejecuta el cifrado (secret_column, 'my_secret_key') revelará su clave a cualquier que pueda leer el archivo pg.log.
  • Las conversiones ODBC/JDBC puede capturarse de forma fácil con todas las herramientas de copia de seguridad o de diagnóstico. Si su clave se transmite como parte del SQL, puede ponerse en riesgo durante este proceso.
Por estos motivos, guarde la clave secreta en una tabla y transfiera la clave a las funciones de cifrado/descifrado a través de una unión de tablas. Por ejemplo:
SELECT decrypt(a.value, b.key) FROM my_table a, my_keys b WHERE 
b.key_id = 1;
El valor algorithm puede ser RC4 o una de las versiones de AES, como se muestra en la siguiente lista:
0
RC4 (predeterminado si no se suministra ningún algoritmo)
1
AES 128
2
AES 192
3
AES 256

RC4, aunque el algoritmo de cifrado utilizado con más frecuencia (por ejemplo, por SSL y WEP) no es seguro desde el punto de vista criptográfico y no es vulnerable a ataques.

El Estándar de cifrado avanzado (AES) es el estándar de cifrado adoptado por el gobierno de los Estados Unidos y es necesario para todas las informaciones confidenciales. Las tres versiones de AES difieren únicamente en cuanto al diseño y a la fortaleza de las longitudes de clave. Aunque las tres longitudes de clave son suficientes para proteger la información confidencial hasta el nivel SECRET, la información TOP SECRET exige el uso de longitudes de clave de 192 o 256.

El valor IV especifica el vector de inicialización que se utiliza para cifrar o descifrar el valor. Puede especificar el valor IV solo cuando utilice algoritmos AES. (El algoritmo RC4 no utiliza el valor IV.) Si no especifica IV, las funciones encrypt() y decrypt() utilizan un valor IV constante.

El cifrado con el modo OFB requiere el valor IV y una clave de 128 bits. Se recomienda especificar valores de clave de 128 bits o IV (si se utiliza) para que el sistema utilice los valores de entrada del usuario. Si el valor es inferior o superior a 128 bits, el sistema utilizará un mecanismo de expansión o derivación para ajustar el valor del siguiente modo:

Nota: Si incluye o llama a una función de cifrado dentro de una función encrypt, el resultado es una cadena cleartext. Por ejemplo:
select encrypt(encrypt('abcde', 'k1', 1), 'k1', 1);
  encrypt
 ---------
  abcde
 (1 row)

Devuelve

La función devuelve un valor cifrado/descifrado. El kit de herramientas SQL Extensions utiliza el modo output feedback (OFB) de AES para el cifrado o descifrado, lo que convierte a un cifrado de bloques en un cifrado de secuencia síncrono. Como cifrado de secuencia, no hay ningún requisito de relleno para OFB y la longitud del texto cifrado de salida es la misma que la del texto sin formato de de entrada. Por ejemplo:
select encrypt('123456',100,0);
 ENCRYPT
---------
 ÉôC¥Ñ
(1 row)

 select encrypt('Netezza Systems','NPS001534',1,'MY_IV is IBM001');
     ENCRYPT
-----------------
 �Ná•▒7Þ¢bhñæ
(1 row)

Generación de clave y IV

Puede utilizar las funciones hash() y rawtohex() para generar claves y IVs. La función hash() devuelve un hash de 128 bits, 160 bits o 256 bits de los datos de entrada, en función de la entrada de algoritmo para la función. El siguiente ejemplo muestra cómo crear una clave de 256 bits para el cifrado AES. En el ejemplo, la salida MYKEY se ha truncado de forma intencionada mediante los caracteres "..." para mostrarse dentro de los límites de la página.

create table impData (cname varchar(35),cid varchar(20));
CREATE TABLE

insert into impData values('Netezza Systems','CNZ0001SYS');
INSERT 0 1

create table securedImpData as select cid, rawtohex(hash(cid,2))
 as mykey, encrypt(cname, rawtohex(hash(cid,2)),2) as ENCRYPTED_CNAME from impData;
INSERT 0 1

select * from securedImpData;
    CID     |                    MYKEY                        | ENCRYPTED_CNAME
------------+-------------------------------------------------+-----------------
 CNZ0001SYS | 8D812C9E8DB362FCB20E...6A00B564175B92762B1A3520 | Ã4W§
      wÂÃð
ŸÃ
(1 row)

create table decryptedData as select CID, decrypt(ENCRYPTED_CNAME,
MYKEY,2) as DECRYPTED_CNAME from securedImpData;
INSERT 0 1

select * from decryptedData;
    CID     | DECRYPTED_CNAME
------------+-----------------
 CNZ0001SYS | Netezza Systems
(1 row)


Feedback | Copyright IBM Corporation 2013 | Last updated: 2013-07-31