Funções encrypt() e decrypt()
As funções encrypt() e decrypt() criptografam ou decriptografam um valor varchar ou nvarchar usando uma chave fornecida.
Criptografia é o processo de transformar dados para manter a sua confidencialidade; os dados podem ser lidos (não criptografados) somente se o destinatário tiver a chave necessária. A implementação do Netezza Performance Server usa criptografia simétrica. Este tipo de criptografia também é conhecido como criptografia privada ou de chave secreta, porque a mesma chave secreta é usada para criptografar e decriptografar dados. Isso significa que essa chave secreta deve ser disponibilizada em qualquer servidor que esteja decriptografando os dados criptografados anteriormente. É possível escolher qual algoritmo de criptografia simétrica às funções usam para criptografar e decriptografar os dados: um Padrão de criptografia avançado (AES) ou RC4.
A criptografia de chave privada é mais segura que a criptografia de chave pública porque todos os esquemas de criptografia de chave pública estão suscetíveis a ataques de procura de chave de força bruta. Entretanto, a criptografia de chave privada depende de manter o sigilo da chave. Portanto, mude periodicamente a chave privada e execute etapas
para assegurar que ela não possa ser descoberta em uso, na área de armazenamento ou na distribuição. Para obter recomendações de segurança específicas do produto Netezza Performance Server, consulte a descrição do argumento ' key mais adiante neste tópico.
As funções encrypt() e decrypt() executam criptografia e decriptografia de nível de campo, não criptografia e decriptografia de banco de dados.
Sintaxe
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]]);
O valor text especifica o valor para criptografar ou decriptografar.
key especifica a chave a ser usada para criptografar ou decriptografar o valor. Tenha cuidado para
proteger a chave: caso contrário, a segurança será comprometida. Ao projetar seu sistema de segurança, tenha em mente a arquitetura do sistema Netezza Performance Server:- As funções SQL são registradas no arquivo ' pg.log no host Netezza Performance Server, portanto, a execução de uma função ' encrypt(secret_column, 'my_secret_key') revela sua chave para qualquer pessoa que possa ler o arquivo ' pg.log.
- Conversas ODBC/JDBC são facilmente capturadas com diversas ferramentas de diagnóstico ou hacking. Se você transmitir sua chave como parte da SQL, a chave poderá ser comprometida durante esse processo.
SELECT decrypt(a.value, b.key) FROM my_table a, my_keys b WHERE
b.key_id = 1;
algorithm pode ser RC4 ou uma das versões de AES, conforme mostrado na lista a seguir:- 0
- RC4. Este é o padrão.
- 1
- AES 128.
- 3
- AES 192.
- 3
- AES 256.
RC4, embora seja o algoritmo de criptografia mais amplamente usado (usado, por exemplo, por SSL e WEP), não é criptograficamente seguro e estávulnerável a ataques.
O Padrão de criptografia avançado (AES) é o padrão de criptografia que foi aprovado pelo governo dos Estados Unidos e é necessário para todas as informações classificadas. As três versões do AES diferem somente no design e na força dos comprimentos das chaves. Embora todos os três comprimentos de chave sejam suficientes para proteger as informações classificadas até o nível SECRET, informações TOP SECRET requererão o uso de 192 ou 256 comprimentos de chave.
O valor IV especifica o vetor de inicialização (IV) que é usado para criptografar ou decriptografar o valor. É possível especificar IV somente ao usar os algoritmos AES. (O algoritmo RC4 não usa o valor de IV.) Se você não especificar um valor IV, as funções encrypt() e decrypt() usarão um valor constante IV.
A criptografia com o modo de feedback de saída (OFB) requer que o IV e a chave sejam de 128 bits. Como uma melhor prática, especifique valores de 128 bits para a chave e o IV (se usado) para que o sistema use seus valores de entrada. Se um valor for menor que ou maior que 128 bits, o sistema usa um mecanismo de expansão ou derivação para ajustar o valor da seguinte forma:
- Para chaves ou IVs que são menores que 128 bits, o sistema duplica o valor até que a chave ou IV alcance o comprimento correto.
- Para chaves ou IVs que são maiores que 128 bits, o sistema cria um valor de 128 bits usando um OR lógico (XOR) dos primeiros 128 bits do valor com os bits restantes do valor.
select encrypt(encrypt('abcde', 'k1', 1), 'k1', 1);
encrypt
---------
abcde
(1 row)Retorna
As funções retornam um valor criptografado ou decriptografado. O kit de ferramentas do SQL Extensions usa o modo OFB do AES para criptografia e decriptografia, o que cria uma cifra de bloco em uma cifra de fluxo síncrono. Como uma cifra de fluxo, não há requisito de preenchimento para OFB, e o comprimento do texto cifrado de saída é o mesmo que aquele do texto simples da entrada.
Exemplo
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)
Geração de chave e IV
É possível usar as funções hash() e rawtohex() para gerar chaves e IVs. A função hash() retorna um hash de 128 bits, 160 bits ou 256 bits dos dados de entrada, dependendo da entrada do algoritmo para a função. O exemplo a seguir mostra como criar uma chave de 256 bits para criptografia AES. No exemplo, a saída de MYKEY é truncada intencionalmente usando caracteres de reticências (...) para que a saída possa ser exibida dentro do limite de 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)