암호화의 개념
이전 장에서는 PL/SQL을 사용해 메일을 보내기 위해 UTL_SMTP나 UTL_MAIL 시스템 패키지를 사용했다. 이번 장에서도 시스템 패키지를 사용해 데이터 암호화를 구현할 텐데 그 주인공은 바로 DBMS_CRYPTO 패키지다. 이 패키지는 암호화 해시 함수부터 DES, AES 등의 암호화 알고리즘을 이용해 데이터를 암호화하고 복호화할 수 있는 일련의 함수와 프로시저를 제공하고 있다. DBMS_CRYPTO 패키지는 10g 버전부터 제공되기 시작했는데 그 이전에는 DBMS_OBFUSCATION_TOOLKIT 패키지를 사용해 암호화 기능을 구현할 수 있었다. 하지만 DBMS_CRYPTO 패키지 자체가 DBMS_OBFUSCATION_TOOLKIT 패키지를 대체할 목적으로 만들어 졌으므로 이 장에서는 DBMS_CRYPTO 패키지 사용법에 대해 설명할 것이다.
이전 장에서 살펴본 UTL_MAIL 패키지처럼 별도의 설치 작업은 필요 없지만 DBMS_CRYPTO 패키지는 개별 사용자에게 권한을 부여해야 사용할 수 있다. 따라서 이 패키지를 사용하기 전에 먼저 다음과 같이 SYS 사용자로 로그인 한 후 권한을 부여해야 한다.
SQL> conn SYS/hong AS SYSDBA; 연결되었습니다. SQL> grant execute on DBMS_CRYPTO to public; 권한이 부여되었습니다.
DBMS_CRYPTO 패키지에 대해 본격적으로 살펴보기 전에 먼저 암호화에 관한 배경지식에 대해 간단하게나마 짚고 넘어가자. 암호화에 대한 자세한 내용은 방대하고 쉽지 않으므로 DBMS_CRYPTO 패키지를 사용하면서 최소한으로 알아야 할 정도의 내용만 소개하겠다.
암호화는 여러 가지 암호화 알고리즘을 이용해 처리하는데 DBMS_CRYPTO에서 구현 가능한 암호화 알고리즘을 정리하면 다음과 같다.
• DES (Data Encryption Standard): NIST(미국 국립표준기술연구소, National Institute of Standards and Technology)에서 미국 표준으로 정했던 56비트 대칭키를 사용한 알고리즘인데, 취약점이 발견되어 표준에서 제외되었고 NIST에서는 사용권고를 철회했다.
• 3DES: DES 알고리즘을 세 번 반복하여 적용한 알고리즘이다.
• AES (Advanced Encryption Standard): DES를 대체하기 위해 NIST에서 공모를 실시해 선택한 알고리즘으로 현재 미국 표준으로 확정되었다. 공모로 미국 표준으로 확정된 대칭형 알고리즘이므로 안전성도 어느 정도 입증되었고 많이 사용되는 암호화 알고리즘이다.
• RC4 (Advanced Encryption Standard): 가장 널리 사용되는 스트림 암호화 방식으로 무작위 치환에 기반을 두고 있다.
• MD5 (Message-Digest algorithm5)와 MD4: 128비트 암호화 해시 함수로 프로그램이나 파일이 원본 그대로인지 확인하는 무결성 검사 등에 사용되는데 결함이 있다고 알려져 있다. 해시 함수는 단방향 암호화 방법으로, 즉 암호화는 가능하지만 복호화가 매우 어려운 것이 특징이다. MD4는 MD5의 초기 버전이다.
• SHA-1 (Secure Hash Algorithm-1): 160비트 해시 값을 만들어내는 암호화 해시 함수로 MD5 보다는 한 단계 나은 버전이다.
• MAC(Message Authentication Code, 메시지인증코드): MD5, SHA-1 같은 단방향 암호화 해시 함수인데 이들과 다른 점은 비밀키를 입력 받아 사용한다는 점이다.
이번에는 암호화 방식에 대해 알아 보자. 주로 사용되는 암호화 방식은 블록 암호화 방식인데 블록 암호화란 암호화 대상 데이터의 길이가 블록 길이보다 크면 이 데이터를 블록 단위로 잘라 암호화 알고리즘을 적용해 암호화를 하는 방식을 말한다. DES, 3DES, AES 등도 모두 블록 암호화 방식이다. 블록 암호화는 여러 가지 방식으로 처리되는데 이 방식을 블록 암호화 모드라 하고 다음과 같이 5가지 모드가 있다.
• ECB(Electric CodeBook): 데이터를 여러 블록으로 나누어 각각 암호화하는 방식으로 모든 블록을 같은 키로 암호화하기 때문에 취약한 방식이다. 사용하지 않는 것이 좋다.
• CBC(Cipher Block Chaining): 이전 블록의 암호화된 결과와 현재 블록을 XOR 연산을 한 다음 이 결과를 다시 암호화하는 방식으로 사용이 권장되는 방식이다. 이전 블록과 연결해야 하므로 체인(Chaining)이라는 이름이 붙은 것이다. 맨 처음 블록은 암호화된 이전 블록이 없으므로 초기화 벡터(Initialization Vector)라는 것을 사용한다. 또한 원본 데이터를 블록으로 자를 때 잘라낸 마지막 블록이 항상 블록 단위 길이와 맞아 떨어지는 것이 아니므로 부족한 길이를 0이나 임의의 비트로 채우는데 이를 패딩이라고 한다.
• CFB(Cipher-FeedBack): CBC를 변형한 방식으로 암호화된 이전 블록을 키 스트림(key stream) 으로 암호화 한 뒤, 이를 현재 블록과 XOR 연산을 한다.
• OFB(Output-FeedBack) 모드: 원본 블록과 암호 알고리즘의 결과를 XOR 연산하는 방식
• CTR(CounTeR) 모드: 블록을 암호화할 때 1씩 증가하는 카운터를 암호화 해서 키 스트림을 만들어내는 방식
지금까지 소개한 암호화 알고리즘과 암호화 방식을 결합해 데이터를 암호화 할 수 있다. 암호화 알고리즘이나 암호화 방식에 대해 더 자세히 알고 싶다면 관련 서적과 자료를 참조하길 바란다. 이 정도로 암호화에 대한 이론 학습은 끝내고 DBMS_CRYPTO 패키지에 대해 자세히 파헤쳐 보자.