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.
Sintaxis
varchar = encrypt(varchar text, varchar key [, int algorithm
[, varchar IV]]);
nvarchar = encrypt(nvarchar text, nvarchar key [, int algorithm
[, varchar IV]]);
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.
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.
SELECT decrypt(a.value, b.key) FROM my_table a, my_keys b WHERE
b.key_id = 1;
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.
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)