sql >> Base de Datos >  >> RDS >> Oracle

Seguridad de la base de datos de Oracle:cifrado y descifrado

El cifrado de datos es muy importante porque es una forma de proteger los datos actuales y archivados para garantizar su confidencialidad. Esto evita un acceso y uso no autorizado. En este artículo, presentaré brevemente algunos aspectos importantes del cifrado y descifrado de datos.

Sistemas de cifrado

En un sistema de encriptación, hay dos componentes principales:el algoritmo de encriptación, cuál es el método utilizado para alterar el valor, y la clave de cifrado , cuya seguridad depende de la vulnerabilidad de los datos cifrados.

Oracle admite dos tipos de algoritmos de cifrado:algoritmos simétricos (utilice la misma clave para cifrar y descifrar datos) para cifrar datos almacenados y algoritmos asimétricos (Se generan 2 claves:una clave privada utilizada para el descifrado y una clave pública que utilizará el remitente del mensaje para cifrar el mensaje) utilizada para el inicio de sesión en la base de datos y para la comunicación entre una base de datos y un cliente.

Los algoritmos de cifrado simétrico disponibles en Oracle son los siguientes:Estándar de cifrado de datos (DES ) que encripta un bloque de 64 bits del texto en 64 bits del texto encriptado, usando una clave de 56 bits, Triple Data Encryption Standard (3-DES ), una versión más avanzada de DES y Estándar de cifrado avanzado (AES ), que encripta un bloque de 128 bits del texto en 128 bits del texto encriptado, usando una clave de 128,129 o 256 bits.

Se puede notar que los algoritmos de encriptación mencionados anteriormente utilizan bloques de dimensión fija, y por lo tanto, el texto que debe ser encriptado será dividido en bloques de cierta dimensión, requerida por el algoritmo utilizado y luego, el algoritmo será aplicado sobre cada uno obtenido. bloquear.

Sin embargo, ¿qué sucede si la dimensión de los datos no es un múltiplo de la dimensión requerida del bloque? La técnica de relleno debe usarse para llenar el último segmento del texto hasta que alcance la dimensión de un bloque. Se puede elegir rellenar con ceros o usar el esquema de relleno llamado PKCS#5. El esquema calcula la diferencia para el último segmento de texto

d =dim_block – dim_data MOD dim_block

y llena cada byte faltante con el valor hexadecimal 0x0d ,

donde bloque_dim es la dimensión en bytes del bloque, requerida por el algoritmo

y llena cada byte faltante con el valor hexadecimal 0x0d ,

donde bloque_dim es la dimensión en bytes del bloque, requerida por el algoritmo

Sin embargo, ¿qué sucede si el texto sin formato consta de varios bloques para cifrar? La técnica del encadenamiento se utiliza, que establece si la encriptación de un bloque depende o no de la encriptación de los bloques anteriores.

Los siguientes tipos de encadenamiento son disponible en Oracle:

  • Libro de códigos electrónico (CHAIN_ECB):cada bloque se cifra de forma independiente al resto de bloques. La desventaja es que se pueden identificar patrones repetitivos en el fragmento de texto.
  • Encadenamiento de bloques de cifrado (CHAIN_CBC):para cada bloque, antes del cifrado, se aplica un operador XOR con un vector. Para el primer bloque de la secuencia se utiliza un vector de inicialización, mientras que para un bloque del resto de la secuencia se utiliza como vector de bits el resultado del cifrado del bloque anterior
  • Comentarios de cifrado (CHAIN_CFB):es similar a CBC, excepto por el hecho de que el operador XOR se aplica después del cifrado del bloque.
  • Comentarios de salida (CHAIN_OFB):es similar a CFB, excepto por el hecho de que el resultado del bloque anterior se cifra antes de aplicar el operador XOR

Para cifrar y descifrar datos podemos utilizar el paquete DBMS_CRYPTO disponible en ORACLE. Para usar este paquete, SYSDBA debe otorgar a los usuarios derechos de ejecución, usando el comando:

GRANT EXECUTE  ON dbms_crypto TO username;

Para el cifrado, dbms_crypto.encrypt se utiliza, que tiene los siguientes parámetros:

dbms_crypto.encrypt(
clear_text IN RAW,
operating_mode IN PLS_INTEGER,
key IN RAW,
initialization_vector IN RAW DEFAULT NULL)
RETURN RAW;

Para el descifrado, dbms_crypto.decrypt se utiliza, que tiene los siguientes parámetros:

dbms_crypto.decrypt(
clear_text IN RAW,
operating_mode IN PLS_INTEGER,
key IN RAW,
initialization_vector IN RAW DEFAULT NULL)
RETURN RAW;

Un modo de funcionamiento está formado por:

código de algoritmo + código de relleno + código de encadenamiento

Estos son algunos ejemplos para cifrar y descifrar datos:

create or replace PROCEDURE encryption(text IN VARCHAR2, encrypted text OUT VARCHAR2) AS  
raw_set RAW(100);  
raw_password RAW(100);  
encryption_result RAW(100);  
encryption_password VARCHAR2(100) := '[email protected]%5,:QxV';  
operation_mode NUMBER; 
    BEGIN    
        raw_set:=utl_i18n.string_to_raw(text,'AL32UTF8');    
        raw_password := utl_i18n.string_to_raw(encryption_password,'AL32UTF8');        
        operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB;        
        encryption_result:=DBMS_CRYPTO.ENCRYPT(raw_set,operation_mode,raw_password);           
        dbms_output.put_line(encryption_result);    
        encryptedtext := RAWTOHEX (encryption_result);  
END; 

variable result_encryption varchar2(200) 
exec encryption('Text to be encrypted', :result_encryption); 
print result_encryption

create or replace PROCEDURE decryption (encrypted_text IN VARCHAR2, decrypted_text OUT VARCHAR2) AS   
raw_set RAW(100);   
raw_password RAW(100);   
decryption_result RAW(100);   
decryption_password VARCHAR2(100) := '[email protected]%5,:QxV';   
operation_mode NUMBER; 
    BEGIN   
        raw_set:=HEXTORAW(encrypted_text);   
        raw_password :=utl_i18n.string_to_raw(decryption_password,'AL32UTF8');   
        operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB;      
        decryption_result:=DBMS_CRYPTO.DECRYPT(raw_set,operation_mode,raw_password);   
        dbms_output.put_line(decryption_result);   
        decrypted_text := utl_i18n.raw_to_char (decryption_result,'AL32UTF8'); 
    END;  
variable result_decryption varchar2(200) 
exec decryption(:result_encryption,:result_decryption) 
print result_decryption 

Desafíos de cifrado de datos

Gestión de claves de cifrado de datos

Es difícil para los usuarios de la base de datos generar manualmente claves de cifrado eficientes, que tengan la longitud requerida para el algoritmo de cifrado. Con respecto al suministro manual de la clave de cifrado como un conjunto de cadenas (convertidas luego en RAW), la longitud del conjunto se calcula utilizando la siguiente fórmula:

L_set =Longitud_clave_en_bits / 8 (caracteres)

Por ejemplo, para ENCRYPT_AES128, la clave tiene 128 bits y el conjunto tendrá la longitud L_set =128/8 =16 caracteres.

Si se proporciona la clave '1234567890123456', se aceptará, mientras que la clave '1234' generará la excepción 'longitud de clave demasiado corta'.

Para el resto de los algoritmos, la siguiente tabla da la longitud efectiva de la clave:

Generación y transmisión de claves

Los datos se cifran de forma segura siempre que la clave utilizada para el cifrado sea segura. Por lo tanto, la clave de cifrado debe generarse de forma segura. El paquete de funciones RANDOMBYTES of DBMS_CRYPTO ofrece una generación segura de números aleatorios e implementa el algoritmo generador de números aleatorios. Los desarrolladores no deben usar el paquete DBMS_RANDOM porque genera números pseudoaleatorios, lo que puede resultar en una pseudoseguridad.

La función RANDOMBYTES se utiliza de la siguiente manera:

clave RAW (nr_bytes);

clave:=DBMS_CRYPTO.randombytes (nr_bytes);

donde nr_bytes representa el número de bytes de la clave de cifrado

Cuando la clave se pasa de una aplicación a la base de datos, debe cifrarse para que no sea robada cuando se transmite. Oracle Advanced Security proporciona cifrado de red, que protege los datos y las claves criptográficas en su tránsito por la red.

Una vez que se generan las claves, deben mantenerse seguras, ya que su divulgación podría comprometer la seguridad de los datos cifrados. Hay tres opciones para conservar la llave:

  • a nivel de base de datos:almacenado en la base de datos (en una tabla especial) o en un archivo de base de datos externo
  • a nivel de registro:almacenado en la base de datos (en una tabla especial)
  • una combinación entre los dos tipos anteriores:hay una clave maestra a nivel de base de datos y para cada registro hay una clave. Se utiliza una clave híbrida tanto para el cifrado como para el descifrado:hybrid_key =master_key XOR record_key (para la función XOR, hay una función PL/SQL:UTL_RAW.bit_xor).

¿Cuál es la clave más eficiente? Es la clave híbrida. Si se roba toda la base de datos, los datos no se pueden descifrar cuando la clave maestra se almacena en el sistema de archivos. Si se roba la clave maestra o un registro clave, el resto del registro aún estaría protegido.

Cifrado de datos transparente (TDE)

Otra instalación de seguridad que ofrece Oracle es el Cifrado de datos transparente (TDE) , una instalación disponible de Oracle 10g. TDE permite declarar una columna cifrada a nivel de tabla de la base de datos. Al insertar datos en la columna cifrada, Oracle cifra automáticamente los datos y almacena su cifrado en la base de datos.

Cualquier consulta SELECT descifrará automáticamente los datos. Es importante recordar que el Cifrado de datos transparente no hace diferencia entre los usuarios y proporciona los datos descifrados sin importar quién esté interrogando la base de datos. TDE no puede cifrar ninguna columna:las columnas de la clave externa (clave externa) no se pueden cifrar con este método.

Por ejemplo:considere una tabla llamada CUENTA con el esquema relacional CUENTA (id_cuenta#, tarjeta_serie, poseedor, monto), donde id_cuenta se considera como clave primaria, hecho denotado por el signo ‘#’. Supongamos que queremos declarar la card_series y equilibrio columnas a cifrar. Esto se puede hacer con lo siguiente:

ALTER TABLE accont MODIFY (card_series ENCRYPT USING 'AES128');
ALTER TABLE accont MODIFY (balance ENCRYPT USING 'AES128');

Para que este método funcione, se debe crear y configurar una billetera.

¿Por qué el Cifrado de datos transparente evitar el descifrado de datos en caso de robo de la base de datos? Bueno, todas las columnas encriptadas de una tabla T usan la misma clave privada Key_T. Si tenemos más tablas, ,…, que tienen columnas encriptadas, entonces hay n claves privadas, Key_,…,Key_. Cada clave privada Key_, j=1,n se cifra con la clave maestra, Key_Master, y el resultado de este cifrado se almacena en el diccionario de datos. La clave maestra se almacena externamente en una billetera.

Ahora, veamos los pasos para este cifrado automático. Ellos son:

  • obteniendo el maestro Key_Master de la billetera externa
  • descifrado de la clave privada, Key_, utilizando la clave maestra
  • cifrado de los datos a insertar mediante la clave privada Key_
  • almacenar los datos cifrados en las columnas de la tabla

Los pasos para el descifrado automático son:

  • obtención de la clave maestra, Key_Master, de la billetera externa
  • descifrado de la clave privada, Key_, utilizando la clave maestra
  • descifrado de los datos utilizando la clave privada, Key_
  • devolviendo el resultado

¿Qué pasa con la integridad de los datos durante el cifrado? Aquí usamos la técnica hash.

Hashing

El cifrado de datos garantiza la confidencialidad de los datos, pero no garantiza su integridad. Para evitar este problema, además de que solo se deben cifrar los datos originales, podemos utilizar una técnica llamada hashing. . tiene dos ventajas importantes:no permite descifrar los valores originales y es determinista (lo que significa que aplicado repetitivamente a los mismos datos, genera el mismo resultado). Oracle permite los siguientes algoritmos hash:MD5 y SHA-1.

Uso:

DBMS_CRYPTO.Hash (
original_set IN RAW,
operation_mode IN PLS_INTEGER) 
RETURN RAW;
where operation_mode is either                        
DBMS_CRYPTO.HASH_MD5 or DBMS_CRYPTO.HASH_SH1

Ejemplo:

set serveroutput on
DECLARE
credit_card_no VARCHAR2(19) := '1234-5678-1234-5678';
credit_card_no_raw RAW(128) := utl_raw.cast_to_raw(credit_card_no);
encrypted_raw RAW(2048);
BEGIN
  encrypted_raw:=dbms_crypto.hash(credit_card_no_raw, dbms_crypto.hash_md5);
  dbms_output.put_line('MD5: ' || encrypted_raw);
END;

Cifrado de datos indexados

No se recomienda que los desarrolladores cifren los datos indexados. Si un índice de una columna contiene valores encriptados, entonces el índice se puede usar para una verificación simple y no se puede usar para otros fines.

Por ejemplo, suponga que una empresa utiliza el número de identificación personal para el número de empleado que se almacena en una tabla de base de datos. Obviamente, esos números se consideran datos sensibles y confidenciales y la empresa quiere cifrar la columna donde se almacena. Debido a que esta columna contiene valores únicos, se puede realizar un índice en ella para tener un mejor rendimiento. Esto significa que el índice contendrá datos encriptados y sería básicamente inutilizable.

Conclusión

Para concluir, es muy importante proteger los datos confidenciales cifrándolos y descifrándolos. Uno debe ser consciente de este aspecto e implementar la seguridad de la base de datos en consecuencia.

Referencias:

  1. Desarrollo de aplicaciones mediante el cifrado de datos
  2. Feuerstein Steven (2009) Programación Oracle PL/SQL (quinta edición). Editorial O'Reilly. ISBN 978-0-596-51446-4. Capítulo 23 "Seguridad de aplicaciones y PL/SQL"
  3. Modo de operación de cifrado en bloque