데이터베이스 기술/POSTGRESQL

[DB 보안] 국산 암호화 알고리즘 ARIA와 SEED를 활용한 PostgreSQL 데이터베이스 보안 강화

(주)비트나인 2023. 8. 11. 16:13

개요

Postgres는 데이터의 보호를 위해 기본적으로 AES, Blowfish와 같은 여러가지 암호화 알고리즘을 지원하고 있다. 이를 위해 Postgres는 pgcrypto라는 extension을 제공하고 있고, pgcrypto를 활용하면 다양한 방법으로 데이터를 보호할 수 있다.

이 글에서는 한국에서 개발되어 국제 표준으로 등록된 대칭키 블록 알고리즘인 ARIA와 SEED 암호화 알고리즘에 대한 이해와 Postgres의 pgcrypto를 사용하여 데이터를 암/복호화 하는 과정을 설명하고자 한다.

ARIA & SEED 알고리즘

ARIA와 SEED 암호화 알고리즘은 대한민국에서 개발된 블록 암호화 알고리즘 이며, 한국의 정보 보안 환경에 맞춰 개발된 국내용 블록 암호화 기술로서 널리 사용하고 있는 알고리즘이다.

ARIA와 SEED알고리즘은 현재 모두 국제 표준으로 등록되어 있다.

ARIA

 

ARIA는 경량 환경 및 하드웨어 구현을 위해 최적화된 Involutional SPN 구조를 갖는 범용 블록 암호 알고리즘이다.

  • Involution 구조 : 암호화 과정과 복호화 과정이 같은 구조
  • SPN 구조 : Substitution-Permuatation-Networks 구조로 S-Box와 확산 함수가 반복적으로 사용되는 구조

주요 특성

  • 블록 크기 : 128 비트
  • 키 길이 : 128/192/256 비트
구분 입.출력 크기[bytes] 입력 키 길이[bytes] 라운드 수
ARIA-128 16 16 12
ARIA-192 16 24 14
ARIA-256 16 32 16
  • 구조 : ISPN(Involutional Substitution-Permutation Network) . 라운드 수: 12/14/16 (키 길이에 따라 결정됨)
  • 경량 환경 및 하드웨어에서의 효율성 향상을 위해, ARIA가 사용하는 대부분의 연산은 XOR과 같은 단순한 바이트 단위 연산으로 구성되어 있다.

SEED

SEED는 전자상거래, 금융, 무선통신 등에서 전송되는 개인정보와 같은 중요한 정보를 보호하기 위해 1999년 2월 한국인터넷진흥 원과 국내 암호전문가들이 순수 국내기술로 개발한 128비트 블록 암호 알고리즘이다.

주요 특성

  • 블록 크기 : 128비트
  • 키 길이 : 128비트
  • 구조 : SPN 구조. 비선형함수를 Look-up 테이부로 변형하여 사용
  • 키생성 알고리즘 : 알고리즘의 라운드 동작과 동시에 암 • 복호화 라운드 키가 생성될 수 있도록 설계

블록 암호의 암호화 기법

일반적으 로 암호화하고자 하는 평문은 128비트 이상이며 매우 다양한 크기로 구성된다. 임의의 크기를 갖는 데이터를 암·복호화하기 위해서는 일정한 입·출력 크기를 갖는 다양한 블록 암호의 기본 알고리즘을 적용할 수 있다. 이를 블록 암호알고리즘의 암호화 기법이라고 한다.

운영모드의 기법에는 ECB, CBC, CTR, CFB, OFB, CCM, GCM, CMAC 등 다양한 방식이 있으나, 이 글에서는 pgcrypto에 실제로 구현할 ECB와 CBC 암호화 기법에 대해 정리하였다.

ECB & CBC

암호화 기법 요약 장점 단점
ECB 평문 블록을 암호화하여 암호문 블록을 생성 구현이 간단, 계산 속도가 빠름, 병렬처리 용이 패턴화된 평문 블록의 노출, 일부 데이터의 변경 또는 삭제에 취약
CBC 블록 전체를 대상으로 암호화, 앞선 블록의 암호문 블록과 함께 현재 평문 블록을 암호화 일부 데이터의 변경 또는 삭제, 패턴화된 평문 블록의 노출에 비교적 안전 연산이 상대적으로 복잡, 무결성 검사 필요

What is pgcrypto?

Postgres 문서에는 pgcrypto에 대하여 다음과 같이 설명하고 있다.

The pgcrypto module provides cryptographic functions for PostgreSQL. This module is considered "trusted", that is, it can be installed by non-superusers who have CREATE privilege on the current database.

즉, Postgres의 추가 모듈인 pgcrypto 모듈을 통해, 암호화 함수를 사용하여 데이터를 암/복호화 할 수 있다는 뜻이다.

pgcrypto X OpenSSL

pgcrypto는 OpenSSL과 연동하여 안전한 데이터베이스 환경을 구축할 수 있다. OpenSSL은 SSL/TLS 암호화 및 인증서 관리 도구에 대한 라이브러리를 제공하는 오픈소스 소프트웨어이다.

이와 관련하여, Postgres 문서에는 아래와 같이 설명하고 있다.

pgcrypto requires OpenSSL and won't be installed if OpenSSL support was not selected when PostgreSQL was built.

OpenSSL을 활용하면 pgcrypto에 ARIA와 SEED 알고리즘을 쉽게 구현할 수 있다!

pgcrypto에는 데이터 암호화를 위해 다양한 암호화 알고리즘들이 구현되어 있는데, 그 중 일부는 OpenSSL에 내장된 알고리즘을 사용하고 있다(ex. AES, Blowfish 알고리즘).

또한, OpenSSL은 ARIA와 SEED 암호화 알고리즘이 내장되어 있기 때문에, pgcrypto에서 ARIA와 SEED 알고리즘을 사용할 수 있다.

 

pgcrypto의 ARIA & SEED 암호화 사용
pgcrypto를 활용하여 ARIA & SEED 암호화 알고리즘을 아래와 같은 방법으로 사용 및 검증할 수 있다.

ARIA 암호화 알고리즘 쿼리문 테스트

쿼리문에 사용한 case 1~3은 국제 표준 문서에서 쓰인 plaintext, key, iv를 사용하고, 결과 값이 문서에 명시된 값과 모두 일치하는지 확인한다.

test=# CREATE EXTENSION pgcrypto; -- pgcrypto extension 생성
CREATE EXTENSION
test=# -- test vector case 1.
test=# SELECT encrypt(
test(# '\x00112233445566778899aabbccddeeff',
test(# '\x000102030405060708090a0b0c0d0e0f',
test(# 'aria-ecb/pad:none');
              encrypt              
------------------------------------
\xd718fbd6ab644c739da95f3be6451778
(1 row)

test=# -- test vector case 2.
test=# SELECT encrypt(
test(# '\x00112233445566778899aabbccddeeff',
test(# '\x000102030405060708090a0b0c0d0e0f1011121314151617',
test(# 'aria-ecb/pad:none');
              encrypt              
------------------------------------
\x26449c1805dbe7aa25a468ce263a9e79
(1 row)

test=# -- test vector case 3.
test=# SELECT encrypt(
test(# '\x00112233445566778899aabbccddeeff',
test(# '\x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',
test(# 'aria-ecb/pad:none');
              encrypt              
------------------------------------
\xf92bd7c79fb72e2f2b8f80c1972d24fc
(1 row)

 

SEED 암호화 알고리즘 쿼리문 테스트

쿼리문에 사용한 case 1~4는 국제 표준 문서에서 쓰인 plaintext, key, iv를 사용하고, 결과 값이 문서에 명시된 값과 모두 일치하는지 확인한다.

test=# CREATE EXTENSION IF NOT EXISTS pgcrypto;
NOTICE:  extension "pgcrypto" already exists, skipping
CREATE EXTENSION
test=# -- test vector case 1.
test=# SELECT encrypt(
test(# '\x000102030405060708090A0B0C0D0E0F',
test(# '\x00000000000000000000000000000000',
test(# 'seed-ecb/pad:none');
              encrypt              
------------------------------------
\x5ebac6e0054e166819aff1cc6d346cdb
(1 row)

test=# -- test vector case 2.
test=#
test=# SELECT encrypt(
test(# '\x00000000000000000000000000000000',
test(# '\x000102030405060708090A0B0C0D0E0F',
test(# 'seed-ecb/pad:none');
              encrypt              
------------------------------------
\xc11f22f20140505084483597e4370f43
(1 row)

test=# -- test vector case 3.
test=#
test=# SELECT encrypt(
test(# '\x83A2F8A288641FB9A4E9A5CC2F131C7D',
test(# '\x4706480851E61BE85D74BFB3FD956185',
test(# 'seed-ecb/pad:none');
              encrypt              
------------------------------------
\xee54d13ebcae706d226bc3142cd40d4a
(1 row)

test=# -- test vector case 1.
test=#
test=# SELECT encrypt(
test(# '\xB41E6BE2EBA84A148E2EED84593C5EC7',
test(# '\x28DBC3BC49FFD87DCFA509B11D422BE7',
test(# 'seed-ecb/pad:none');
              encrypt              
------------------------------------
\x9b9b7bfcd1813cb95d0b3618f40f5122
(1 row)


ARIA & SEED 알고리즘을 사용한 데이터 암/복호화

name, age, car 정보를 가진 users 라는 테이블을 만들어 age는 ARIA 알고리즘을, car는 SEED 알고리즘을 사용하여 데이터를 암/복호화 해보자.

암호화에 사용된 key와 iv의 값은 아래의 값을 임의로 정하여 사용하기로 한다.

test=# CREATE TABLE users (
test(#     id SERIAL PRIMARY KEY,
test(#     user_name VARCHAR(200),
test(#     age VARCHAR(200),
test(#     car VARCHAR(200)
test(# );
CREATE TABLE
test=# CREATE EXTENSION pgcrypto;
CREATE EXTENSION
test=# INSERT INTO users (user_name, age, car)
test-# VALUES (
test(#     'Kisoon Kwon',
test(#     encrypt_iv('20', '0123456', 'abcd', 'aria'),
test(#     encrypt_iv('Porsche 911', '0123456', 'abcd', 'seed')
test(# );
INSERT 0 1
test=# select * from users;
id |  user_name  |                age                 |                car                
----+-------------+------------------------------------+------------------------------------
  1 | Kisoon Kwon | \x10c24755d844ccdd1492dc29f3777b48 | \x771f0ed443beadd5a2762298fd0df0d6
(1 rows)

test=# SELECT id,
test-# user_name,
test-# encode(decrypt_iv('\x10c24755d844ccdd1492dc29f3777b48', '0123456', 'abcd', 'aria'), 'escape') as age,
test-# encode(decrypt_iv('\x771f0ed443beadd5a2762298fd0df0d6', '0123456', 'abcd', 'seed'), 'escape') as car
test-# FROM users;
id |  user_name  | age |     car    
----+-------------+-----+-------------
  1 | Kisoon Kwon | 20  | Porsche 911
(1 rows)

마치며..

Postgres의 pgcrypto와 OpenSSL을 활용하면, 다양한 암호화 알고리즘을 사용하여 데이터를 보호할 수 있다는 것을 확인 할 수 있었다. 그러나, 암/복호화 알고리즘을 새로 구현하는 경우, Postgres는 구현한 알고리즘의 정확성, 안정성을 보장해주지 않기 때문에, 충분한 검증과정을 거쳐야 한다. 또한, OpenSSL에 존재하지 않는 다른 암호화 알고리즘을 구현해야 하는 경우에도 기존 암호화 알고리즘에는 어떠한 영향도 주지 말아야 하며, 관련 문서 검토와 충분한 검증을 진행한 후에 사용해야 할 것이다.

 


 

작업 및 테스트 환경

  • Test OS : MacOS 13.4.1 (c)(22F770820d)
  • Test branch : origin/REL_16_STABLE

참고 문헌


글 : 권기순 수석보 ( 비트나인 R&D Lead팀 )