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:
- Desenvolvendo aplicativos usando criptografia de dados
- 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"
- Modo de operação de cifra de bloco