Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle Database Security – Criptografia e Descriptografia


A criptografia de dados é muito importante porque é uma forma de proteger os dados atuais e arquivados para garantir sua confidencialidade. Isso evita acesso e uso não autorizados. Neste artigo, apresentarei brevemente alguns aspectos importantes da criptografia e descriptografia de dados.


Sistemas de criptografia


Em um sistema de criptografia, há dois componentes principais:o algoritmo de criptografia que é o método usado para alterar o valor e a chave de criptografia , cuja segurança depende da vulnerabilidade dos dados criptografados.

A Oracle oferece suporte a dois tipos de algoritmos de criptografia:algoritmos simétricos (use a mesma chave para criptografar e descriptografar dados) para criptografar dados armazenados e algoritmos assimétricos (são geradas 2 chaves:uma chave privada usada para descriptografia e uma chave pública que será usada pelo remetente da mensagem para criptografar a mensagem) usada para login no banco de dados e para comunicação entre um banco de dados e um cliente.

Os algoritmos de criptografia simétrica disponíveis no Oracle são os seguintes:Data Encryption Standard (DES ) que criptografa um bloco de 64 bits do texto em 64 bits do texto criptografado, usando uma chave de 56 bits, Triple Data Encryption Standard (3-DES ), uma versão mais avançada do DES e Advanced Encryption Standard (AES ), que criptografa um bloco de 128 bits do texto em 128 bits do texto criptografado, usando uma chave de 128.129 ou 256 bits.

Pode-se notar que os algoritmos de criptografia citados acima utilizam blocos de dimensão fixa e, portanto, o texto que deve ser criptografado será dividido em blocos de determinada dimensão, requeridos pelo algoritmo utilizado e então, o algoritmo será aplicado em cada um obtido quadra.

No entanto, e se a dimensão dos dados não for um múltiplo da dimensão necessária do bloco? A técnica de preenchimento deve ser utilizado para preencher o último segmento do texto até atingir a dimensão de um bloco. Pode-se optar por preencher com zeros ou usar o esquema de preenchimento chamado PKCS#5. O esquema calcula a diferença para o último segmento de texto

d =dim_block – dim_data MOD dim_block

e preenche cada byte ausente com o valor hexa 0x0d ,

onde dim_block é a dimensão em bytes para o bloco, exigida pelo algoritmo

e preenche cada byte ausente com o valor hexa 0x0d ,

onde dim_block é a dimensão em bytes para o bloco, exigida pelo algoritmo

No entanto, e se o texto simples consistir em vários blocos a serem criptografados? A técnica de encadeamento é usado, que estabelece se a criptografia de um bloco é dependente ou não da criptografia dos blocos anteriores.

Os seguintes tipos de encadeamento são disponível no Oracle:
  • Livro de Código Eletrônico (CHAIN_ECB):cada bloco é criptografado independentemente do resto dos blocos. A desvantagem é que se pode identificar padrões repetitivos no fragmento de texto.
  • Encadeamento de blocos de cifra (CHAIN_CBC):para cada bloco, antes da criptografia, é aplicado um operador XOR com um vetor. Para o primeiro bloco da sequência, é usado um vetor de inicialização, enquanto para um bloco do restante da sequência, o resultado da criptografia do bloco anterior é usado como vetor de bits
  • Comentários de criptografia (CHAIN_CFB):é semelhante ao CBC, exceto pelo fato de que o operador XOR é aplicado após a criptografia do bloco.
  • Feedback de saída (CHAIN_OFB):é semelhante ao CFB, exceto pelo fato de que o resultado do bloco anterior é criptografado antes da aplicação do operador XOR

Para criptografar e descriptografar os dados, podemos utilizar o pacote DBMS_CRYPTO disponível no ORACLE. Para usar este pacote, o SYSDBA deve conceder aos usuários direitos de execução, usando o comando:
GRANT EXECUTE  ON dbms_crypto TO username;

Para criptografia, dbms_crypto.encrypt é usado, que tem os seguintes 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 descriptografia, dbms_crypto.decrypt é usado, que tem os seguintes 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;

Um modo de operação é formado por:

código de algoritmo + código de preenchimento + código de encadeamento



Aqui estão alguns exemplos para criptografar e descriptografar dados:
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 








Desafios de criptografia de dados


Gerenciamento de chaves de criptografia para dados

É difícil para os usuários do banco de dados gerar manualmente chaves de criptografia eficientes, que tenham o comprimento necessário para o algoritmo de criptografia. No que diz respeito ao fornecimento manual da chave de criptografia como um conjunto de strings (convertido depois em RAW), o comprimento do conjunto é calculado usando a seguinte fórmula:

L_set =Length_key_in_bits / 8 (caracteres)

Por exemplo, para ENCRYPT_AES128, a chave tem 128 bits e o conjunto terá o comprimento L_set =128/8 =16 caracteres.

Se a chave '1234567890123456' for fornecida, ela será aceita, enquanto a chave '1234' lançará a exceção 'comprimento da chave muito curto'.

Para o restante dos algoritmos, a tabela a seguir fornece o comprimento efetivo da chave:



Geração e transmissão de chaves

Os dados são criptografados com segurança, desde que a chave usada para criptografar seja segura. Portanto, a chave de criptografia deve ser gerada com segurança. O pacote de funções RANDOMBYTES of DBMS_CRYPTO oferece uma geração segura de números aleatórios e implementa o algoritmo gerador de números aleatórios. Os desenvolvedores não devem usar o pacote DBMS_RANDOM porque ele gera números pseudo-aleatórios, o que pode resultar em pseudo-segurança.

A função RANDOMBYTES é usada da seguinte forma:

chave RAW (nr_bytes);

chave:=DBMS_CRYPTO.randombytes (nr_bytes);

onde nr_bytes representa o número de bytes da chave de criptografia

Quando a chave é passada de um aplicativo para o banco de dados, ela deve ser criptografada para não ser roubada durante a transmissão. O Oracle Advanced Security fornece criptografia de rede, que protege os dados e as chaves criptográficas em seu trânsito de rede.

Uma vez geradas as chaves, elas devem ser mantidas em segurança, pois sua divulgação pode comprometer a segurança dos dados criptografados. Existem três opções para manter a chave:
  • no nível do banco de dados:armazenado no banco de dados (em uma tabela especial) ou em um arquivo de banco de dados externo
  • no nível de registro:armazenado no banco de dados (em uma tabela especial)
  • uma combinação entre os dois tipos anteriores:existe uma chave mestra no nível do banco de dados e para cada registro, existe uma chave. Uma chave híbrida é usada para criptografia e descriptografia:hybrid_key =master_key XOR record_key (para a função XOR, existe uma função PL/SQL – UTL_RAW.bit_xor).

Qual é a chave mais eficiente? É a chave híbrida. Se todo o banco de dados for roubado, os dados não poderão ser descriptografados quando a chave mestra for armazenada no sistema de arquivos. Se a chave mestra ou um registro de chave for roubado, o restante do registro ainda estará protegido.

Criptografia de dados transparente (TDE)

Outro recurso de segurança oferecido pela Oracle é o Transparent Data Encryption (TDE) , um recurso disponível no Oracle 10g. A TDE permite declarar uma coluna criptografada no nível da tabela do banco de dados. Ao inserir dados na coluna criptografada, o Oracle criptografa automaticamente os dados e armazena sua criptografia no banco de dados.

Qualquer consulta SELECT irá descriptografar automaticamente os dados. É importante lembrar que a Criptografia de Dados Transparente não faz diferença entre os usuários e fornece os dados descriptografados, não importa quem esteja interrogando o banco de dados. Nenhuma coluna pode ser criptografada por TDE:colunas da chave externa (chave estrangeira) não podem ser criptografadas usando este método.

Por exemplo:considere uma tabela chamada ACCOUNT com o esquema relacional ACCOUNT (id_account#, card_series, possuidor, valor), onde id_account é considerado a chave primária, fato denotado pelo sinal ‘#’. Vamos supor que queremos declarar a card_series e saldo colunas a serem criptografadas. Isso pode ser feito com o seguinte:
ALTER TABLE accont MODIFY (card_series ENCRYPT USING 'AES128');
ALTER TABLE accont MODIFY (balance ENCRYPT USING 'AES128');

Para que este método funcione, uma carteira deve ser criada e configurada.

Por que a Criptografia de dados transparente impedir a descriptografia de dados caso o banco de dados seja roubado? Bem, todas as colunas criptografadas de uma tabela T usam a mesma chave privada Key_T. Se temos mais tabelas, ,…, que possuem colunas criptografadas, então existem n chaves privadas, Key_,…,Key_. Cada chave privada Key_, j=1,n é criptografada com a chave mestra, Key_Master, e o resultado dessa criptografia é armazenado no dicionário de dados. A chave mestra é armazenada externamente em uma carteira.

Agora, vamos ver as etapas para essa criptografia automática. Eles estão:
  • obtendo o mestre Key_Master da carteira externa
  • descriptografia da chave privada, Key_, usando a chave mestra
  • criptografia dos dados a serem inseridos usando a chave privada, Key_
  • armazenando os dados criptografados nas colunas da tabela

As etapas para a descriptografia automática são:
  • obtendo a chave mestra, Key_Master, da carteira externa
  • descriptografia da chave privada, Key_, usando a chave mestra
  • descriptografia dos dados usando a chave privada, Key_
  • retornando o resultado

E quanto à integridade dos dados durante a criptografia? Aqui é que usamos a técnica de hash.

Hashing

A criptografia de dados garante a confidencialidade dos dados, mas não garante sua integridade. Para evitar esse problema, além do fato de que apenas os dados originais devem ser criptografados, podemos usar uma técnica chamada hashing . existem duas vantagens importantes:não permite decifrar os valores originais e é determinístico (o que significa que aplicado repetidamente aos mesmos dados, gera o mesmo resultado). A Oracle permite os seguintes algoritmos de hash:MD5 e 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

Exemplo:
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;




Criptografia de dados indexados


Não é recomendado que os desenvolvedores criptografem dados indexados. Se um índice de uma coluna contiver valores criptografados, o índice poderá ser usado para verificação simples e não poderá ser usado para outros fins.

Por exemplo, suponha que uma empresa use o número de identificação pessoal para o número do funcionário armazenado em uma tabela de banco de dados. Obviamente, esses números são considerados dados sensíveis e confidenciais e a empresa deseja criptografar a coluna onde estão armazenados. Como essa coluna contém valores exclusivos, um índice pode ser executado nela para obter um melhor desempenho. Isso significa que o índice conterá dados criptografados e seria basicamente inutilizável.

Conclusão


Para concluir, é muito importante proteger os dados confidenciais criptografando e descriptografando-os. Deve-se estar ciente desse aspecto e implementar a segurança do banco de dados de acordo.

Referências:

  1. Desenvolvendo aplicativos usando criptografia de dados
  2. Feuerstein Steven (2009) Programação Oracle PL/SQL (5ª edição). Editora O'Reilly. ISBN 978-0-596-51446-4. Capítulo 23 "Segurança de aplicativos e PL/SQL"
  3. Modo de operação de cifra de bloco