암호화() 및 암호 해독() 함수

' encrypt() ' 및 ' decrypt() ' 함수는 제공된 키를 사용하여 varchar 또는 nvarchar 값을 암호화하거나 복호화합니다.

암호화는 데이터의 비밀을 유지하기 위해 데이터를 변환하는 과정으로, 수신자에게 필요한 키가 있는 경우에만 데이터를 읽을 수 있습니다(암호화되지 않은 상태). Netezza Performance Server 구현은 대칭형 암호화를 사용합니다. 이러한 유형의 암호화는 데이터를 암호화하고 해독하는 데 동일한 비밀 키를 사용하기 때문에 개인 또는 비밀 키 암호화라고도 합니다. 즉, 이 비밀 키는 이전에 암호화된 데이터를 해독하는 모든 서버에서 사용할 수 있어야 합니다. 함수가 데이터를 암호화하고 해독하는 데 사용하는 대칭 암호화 알고리즘을 고급 암호화 표준(AES) 또는 RC4 중 선택할 수 있습니다.

모든 공개 키 암호화 체계는 무차별 키 검색 공격에 취약하기 때문에 개인 키 암호화는 공개 키 암호화보다 더 안전합니다. 그러나 개인 키 암호화는 키의 비밀을 유지하는 데 달려 있습니다. 따라서 주기적으로 개인 키를 변경하고 사용 중, 저장 중 또는 배포 중에 개인 키가 발견되지 않도록 조치를 취해야 합니다. Netezza Performance Server 제품에 특정한 보안 권장 사항은 이 주제 뒷부분의 ' key 인수에 대한 설명을 참조하세요.

' encrypt() ' 및 ' decrypt() ' 함수는 데이터베이스 암호화 및 복호화가 아닌 필드 수준 암호화 및 복호화를 수행합니다.

중요: ' encrypt() ' 함수를 사용하여 입력 nvarchar 값을 처리하는 경우 애플리케이션과 쿼리 프로세스를 ' encrypt_nvarchar() ' 및 ' decrypt_nvarchar() ' 함수를 사용하도록 전환해야 합니다. ' encrypt() ' 함수는 이전 버전 및 결과와의 호환성을 위해 유지되지만 ' encrypt('NVARCHAR') 함수 값을 저장하는 테이블 및 뷰는 로드 및 통계 생성 작업 중에 문제가 발생할 수 있습니다.

구문

' encrypt() ' 함수의 구문은 다음과 같습니다:
varchar = encrypt(varchar text, varchar key [, int algorithm 
          [, varchar IV]]);
nvarchar = encrypt(nvarchar text, nvarchar key [, int algorithm 
          [, varchar IV]]);
' decrypt() ' 함수의 구문은 다음과 같습니다:
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의 일부로 전송하는 경우 이 과정에서 키가 손상될 수 있습니다.
따라서 비밀 키를 테이블에 저장하고 테이블 조인을 통해 ' encrypt() ' 및 ' decrypt() ' 함수에 키를 전달합니다. 예는 다음과 같습니다.
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비트 값을 생성합니다.
' encrypt() 함수를 ' encrypt() ' 함수 안에 포함하거나 호출하면 다음 예시와 같이 결과가 일반 텍스트 문자열이 됩니다:
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)