Funciones encrypt() y decrypt()

Las funciones encrypt() y decrypt() descifran o cifran un valor varchar o nvarchar utilizando una 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 Netezza Performance Server utiliza cifrado simétrico. Este tipo se conoce también 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 tanto, deberá cambiarla cada cierto tiempo y adoptar medidas para asegurarse de que no pueda descubrirse cuando se utilice, almacene o distribuya. Para recomendaciones de seguridad específicas del producto Netezza Performance Server, consulte la descripción del argumento ' key ' más adelante en el tema.

Las funciones encrypt() y decrypt() realizan un cifrado y descifrado a nivel de campo, no un cifrado o descifrado de base de datos.

Importante: Si está utilizando la función " encrypt() " para procesar valores nvarchar de entrada, debe cambiar sus aplicaciones y procesos de consulta para utilizar las funciones " encrypt_nvarchar() y " decrypt_nvarchar() ". La función encrypt() se conserva para ofrecer compatibilidad con las versiones y resultados anteriores, pero las tablas y las vistas que almacenan los valores de función encrypt('NVARCHAR') podrían encontrar problemas durante las cargas y las operaciones GENERATE STATISTICS.

Sintaxis

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 o descifrar el valor. Asegúrese de proteger la clave; de lo contrario, la seguridad se verá comprometida. Al diseñar su sistema de seguridad, tenga en cuenta la arquitectura del sistema Netezza Performance Server:
  • Las funciones SQL se registran en el archivo ' pg.log ' del host Netezza Performance Server, por lo que la ejecución de una función ' encrypt(secret_column, 'my_secret_key') ' revela su clave a cualquiera que pueda leer el archivo ' pg.log.
  • Las conversiones ODBC/JDBC puede capturarse de forma fácil con todas las herramientas de ataque informático o de diagnóstico. Si transmite su clave como parte del SQL, puede ponerla en riesgo durante este proceso.
Por estos motivos, guarde la clave secreta en una tabla y transfiera la clave a las funciones encrypt() y decrypt() a través de una unión de tablas. A continuación se ofrece un 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. Este es el valor predeterminado.
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 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 (IV) 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 un valor IV, las funciones encrypt() y decrypt() utilizan un valor IV constante.

El cifrado con el modo de feedback de salida (OFB) requiere el valor IV y una clave de 128 bits. Se recomienda especificar valores de 128 bits para la clave e 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:

  • Para las claves o valores IV inferiores a 128 bits, el sistema dobla el valor hasta que la clave o el valor IV alcanza la longitud correcta.
  • Para las claves o valores IV superiores a 128 bits, el sistema crea un valor de 128 bits utilizando un OR lógico (XOR) de los primeros 128 bits del valor con los bits restantes del valor.
Si incluye o llama a una función encrypt() dentro de una función encrypt(), el resultado es una cadena de texto simple, como se muestra en el siguiente ejemplo:
select encrypt(encrypt('abcde', 'k1', 1), 'k1', 1);
  encrypt
 ---------
  abcde
 (1 row)

Devuelve

Las funciones devuelven un valor cifrado o descifrado. El kit de herramientas SQL Extensions utiliza el modo 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 entrada.

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 de IV

Puede utilizar las funciones hash() y rawtohex() para generar las claves y los IV. 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 puntos suspensivos (...) para que la salida se pueda mostrar en el límite 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)