funzioni encrypt() e decrypt()
Le funzioni " encrypt() e " decrypt() cifrano o decifrano un valore varchar o nvarchar utilizzando una chiave fornita.
La crittografia è il processo di trasformazione dei dati per mantenerne la segretezza; i dati possono essere letti (in chiaro) solo se il destinatario possiede la chiave necessaria. L'implementazione di Netezza Performance Server utilizza la crittografia simmetrica. Questo tipo di crittografia è noto anche come crittografia a chiave privata o segreta, perché la stessa chiave segreta viene utilizzata per crittografare e decrittografare i dati. Ciò significa che questa chiave segreta deve essere resa disponibile su qualsiasi server che decifri i dati precedentemente crittografati. È possibile scegliere l'algoritmo di crittografia simmetrica utilizzato dalle funzioni per crittografare e decrittografare i dati: Advanced Encryption Standard (AES) o RC4.
La crittografia a chiave privata è più sicura di quella a chiave pubblica perché tutti gli schemi di crittografia a chiave pubblica sono suscettibili di attacchi di ricerca di chiavi a forza bruta. Tuttavia, la crittografia a chiave privata dipende dal mantenimento della segretezza della chiave. Pertanto, modificate periodicamente la chiave privata e adottate misure per garantire che non possa essere scoperta durante l'uso, l'archiviazione o la distribuzione. Per le raccomandazioni di sicurezza specifiche del prodotto Netezza Performance Server, vedere la descrizione dell'argomento 'key più avanti nell'argomento.
Le funzioni " encrypt() e " decrypt() eseguono la crittografia e la decrittografia a livello di campo, non la crittografia e la decrittografia del database.
Sintassi
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]]);
Il valore " text specifica il valore da criptare o decriptare.
key specifica la chiave da utilizzare per criptare o decriptare il valore. Fare attenzione a proteggere la chiave, altrimenti la sicurezza è compromessa. Quando si progetta il sistema di sicurezza, tenere presente l'architettura del sistema Netezza Performance Server:- Le funzioni SQL vengono registrate nel file 'pg.log sull'host Netezza Performance Server, quindi l'esecuzione di una funzione 'encrypt(secret_column, 'my_secret_key') rivela la chiave a chiunque possa leggere il file 'pg.log.
- Le conversazioni JDBC sono facilmente catturabili con qualsiasi strumento di diagnostica o di hacking. Se si trasmette la chiave come parte dell'SQL, la chiave può essere compromessa durante questo processo.
SELECT decrypt(a.value, b.key) FROM my_table a, my_keys b WHERE
b.key_id = 1;
algorithm può essere RC4 o una delle versioni di AES, come indicato nell'elenco seguente:- 0
- RC4. Questa è l'impostazione predefinita.
- 1
- AES 128.
- 2
- AES 192.
- 3
- AES 256.
L'RC4, sebbene sia l'algoritmo di crittografia più diffuso (utilizzato, ad esempio, da SSL e WEP), non è crittograficamente sicuro ed è vulnerabile agli attacchi.
L'Advanced Encryption Standard (AES) è lo standard di crittografia adottato dal governo degli Stati Uniti e richiesto per tutte le informazioni classificate. Le tre versioni di AES si differenziano solo per la struttura e la forza delle chiavi. Sebbene tutte e tre le lunghezze di chiave siano sufficienti per proteggere le informazioni classificate fino al livello SECRET, le informazioni TOP SECRET richiedono l'uso di chiavi di lunghezza 192 o 256.
Il valore " IV specifica il vettore di inizializzazione (IV) utilizzato per criptare o decriptare il valore. È possibile specificare l'IV solo quando si utilizzano gli algoritmi AES. (L'algoritmo RC4 non utilizza il valore IV) Se non si specifica il valore 'IV, le funzioni 'encrypt() e 'decrypt() utilizzano il valore costante 'IV.
La crittografia con la modalità output feedback (OFB) richiede che l'IV e la chiave siano di 128 bit. Come prassi ottimale, specificare valori a 128 bit per la chiave e l'IV (se utilizzato), in modo che il sistema utilizzi i valori immessi. Se un valore è inferiore o superiore a 128 bit, il sistema utilizza un meccanismo di espansione o derivazione per regolare il valore come segue:
- Per chiavi o IV inferiori a 128 bit, il sistema duplica il valore finché la chiave o l'IV non raggiunge la lunghezza corretta.
- Per chiavi o IV di dimensioni superiori a 128 bit, il sistema crea un valore a 128 bit utilizzando un OR logico (XOR) dei primi 128 bit del valore con i restanti bit del valore.
select encrypt(encrypt('abcde', 'k1', 1), 'k1', 1);
encrypt
---------
abcde
(1 row)Risultati
Le funzioni restituiscono un valore crittografato o decrittografato. Il toolkit SQL Extensions utilizza la modalità OFB di AES per la crittografia e la decrittografia, che trasforma un cifrario a blocchi in un cifrario a flusso sincrono. Essendo un cifrario a flusso, l'OFB non richiede padding e la lunghezza del testo cifrato in uscita è uguale a quella del testo in chiaro in ingresso.
Esempio
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)
Generazione di chiavi e IV
È possibile utilizzare le funzioni " hash() e " rawtohex() per generare chiavi e IV. La funzione " hash() restituisce un hash a 128, 160 o 256 bit dei dati in ingresso, a seconda dell'algoritmo inserito per la funzione. L'esempio seguente mostra come creare una chiave a 256 bit per la crittografia AES. Nell'esempio, l'output MYKEY è intenzionalmente troncato utilizzando i caratteri ellissi (...) in modo che l'output possa essere visualizzato entro i limiti della pagina.
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)