암호화() 및 암호 해독() 함수
' encrypt() ' 및 ' decrypt() ' 함수는 제공된 키를 사용하여 varchar 또는 nvarchar 값을 암호화하거나 복호화합니다.
암호화는 데이터의 비밀을 유지하기 위해 데이터를 변환하는 과정으로, 수신자에게 필요한 키가 있는 경우에만 데이터를 읽을 수 있습니다(암호화되지 않은 상태). Netezza Performance Server 구현은 대칭형 암호화를 사용합니다. 이러한 유형의 암호화는 데이터를 암호화하고 해독하는 데 동일한 비밀 키를 사용하기 때문에 개인 또는 비밀 키 암호화라고도 합니다. 즉, 이 비밀 키는 이전에 암호화된 데이터를 해독하는 모든 서버에서 사용할 수 있어야 합니다. 함수가 데이터를 암호화하고 해독하는 데 사용하는 대칭 암호화 알고리즘을 고급 암호화 표준(AES) 또는 RC4 중 선택할 수 있습니다.
모든 공개 키 암호화 체계는 무차별 키 검색 공격에 취약하기 때문에 개인 키 암호화는 공개 키 암호화보다 더 안전합니다. 그러나 개인 키 암호화는 키의 비밀을 유지하는 데 달려 있습니다. 따라서 주기적으로 개인 키를 변경하고 사용 중, 저장 중 또는 배포 중에 개인 키가 발견되지 않도록 조치를 취해야 합니다. Netezza Performance Server 제품에 특정한 보안 권장 사항은 이 주제 뒷부분의 ' key 인수에 대한 설명을 참조하세요.
' encrypt() ' 및 ' decrypt() ' 함수는 데이터베이스 암호화 및 복호화가 아닌 필드 수준 암호화 및 복호화를 수행합니다.
구문
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]]);
' text ' 값은 암호화 또는 복호화할 값을 지정합니다.
key ' 값은 값을 암호화하거나 해독하는 데 사용할 키를 지정합니다. 키 보안에 주의하세요. 그렇지 않으면 보안이 손상될 수 있습니다. 보안 시스템을 설계할 때는 Netezza Performance Server 시스템의 아키텍처를 염두에 두세요:- SQL 함수는 Netezza Performance Server 호스트의 ' pg.log 파일에 기록되므로 ' encrypt(secret_column, 'my_secret_key') ' 함수를 실행하면 ' pg.log ' 파일을 읽을 수 있는 모든 사람에게 키가 공개됩니다.
- JDBC 대화는 여러 진단 또는 해킹 도구로 쉽게 캡처할 수 있습니다. 키를 SQL의 일부로 전송하는 경우 이 과정에서 키가 손상될 수 있습니다.
SELECT decrypt(a.value, b.key) FROM my_table a, my_keys b WHERE
b.key_id = 1;
algorithm ' 값은 다음 목록에 표시된 것처럼 RC4 또는 AES 버전 중 하나일 수 있습니다:- 0
- RC4. 이는 기본값입니다.
- 1
- AES 128.
- 2개
- AES 192.
- 3
- AES 256.
RC4 가장 널리 사용되는 암호화 알고리즘(예: SSL 및 WEP에서 사용)이지만 암호화적으로 안전하지 않으며 공격에 취약합니다.
고급 암호화 표준(AES)은 미국 정부에서 채택한 암호화 표준으로, 모든 기밀 정보에 요구되는 암호화 표준입니다. 세 가지 버전의 AES는 키 길이의 디자인과 강도만 다릅니다. 세 가지 키 길이 모두 비밀 수준까지 기밀 정보를 보호하는 데 충분하지만, 일급 비밀 정보는 192개 또는 256개의 키 길이를 사용해야 합니다.
' IV ' 값은 값을 암호화하거나 해독하는 데 사용되는 초기화 벡터(IV)를 지정합니다. AES 알고리즘을 사용할 때만 IV를 지정할 수 있습니다. ( RC4 알고리즘은 IV 값을 사용하지 않습니다.) ' IV 값을 지정하지 않으면 ' encrypt() ' 및 ' decrypt() ' 함수는 상수 ' IV ' 값을 사용합니다.
출력 피드백(OFB) 모드를 사용한 암호화는 IV와 키가 128비트여야 합니다. 시스템에서 입력 값을 사용하도록 키와 IV(사용하는 경우)에 128비트 값을 지정하는 것이 가장 좋습니다. 값이 128비트보다 작거나 큰 경우, 시스템은 확장 또는 파생 메커니즘을 사용하여 다음과 같이 값을 조정합니다:
- 128비트보다 작은 키 또는 IV의 경우, 시스템은 키 또는 IV가 올바른 길이에 도달할 때까지 값을 복제합니다.
- 128비트보다 큰 키 또는 IV의 경우, 시스템은 값의 처음 128비트와 나머지 비트의 논리적 OR(XOR)을 사용하여 128비트 값을 생성합니다.
select encrypt(encrypt('abcde', 'k1', 1), 'k1', 1);
encrypt
---------
abcde
(1 row)반환
이 함수는 암호화된 값 또는 암호 해독된 값을 반환합니다. SQL 확장 툴킷은 암호화 및 복호화를 위해 AES의 OFB 모드를 사용하여 블록 암호를 동기 스트림 암호로 만듭니다. 스트림 암호로서 OFB에는 패딩 요구 사항이 없으며 출력 암호 텍스트의 길이는 입력 평문 텍스트의 길이와 동일합니다.
예
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)
키 및 IV 생성
' hash() ' 및 ' rawtohex() ' 함수를 사용하여 키와 IV를 생성할 수 있습니다. ' hash() ' 함수는 함수에 입력된 알고리즘에 따라 입력 데이터의 128비트, 160비트 또는 256비트 해시를 반환합니다. 다음 예는 AES 암호화를 위한 256비트 키를 만드는 방법을 보여줍니다. 이 예에서는 페이지 경계 내에서 출력이 표시될 수 있도록 줄임표(...) 문자를 사용하여 MYKEY 출력을 의도적으로 잘라냈습니다.
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)