주식회사 누리아이티

정보자산의 보안강화를 위한 2차인증 보안SW 및 지문인식 OTP/출입/보안카드 전문기업

▶ BaroSolution/가이드

가볍고 가장 빠른 암호화 알고리즘을 위한 BaroCRYPT 솔루션의 API 가이드(PostgreSQL)

누리아이티 2022. 2. 22. 15:51

목차
 
1. 정보보안(Information Security)
1.1 정보보안의 정의
1.2 정보보안의 3요소
1.3 정보보안 관련 용어 정리
1.4 정보보안의 침해사고
1.5 정보보안의 대비책
1.6 정보보안의 주요 법령과 규정
1.7 개인정보 암호화 대상 항목
 

2. PostgreSQL 암복호화 모듈
2.1 pgcrypto 모듈
2.2 암복호화 함수
2.3 암복호화 함수 생성
2.4 암복호화 함수 생성 확인
2.5 암복호화 함수 테스트

 

3. About BaroCRYPT

 

 

1. 정보보안(Information Security)

1.1 정보보안의 정의

 

정보보안에 대한 정의는 정보보안을 다루는 주체나 기관에 따라 다양하게 정의를 내리고 있다.

 

① "정보의 기밀성, 무결성, 가용성의 보존. 추가적으로 진정성(authenticity), 책임성(accountability), 부인방지(non-repudiation), 그리고 신뢰성(reliability)와 관계가 있을 수 있다." (ISO/IEC 27000:2009)

 

 "인가되지 않은 접근, 사용, 폭로, 붕괴, 수정, 파괴로부터 정보와 정보 시스템을 보호해 기밀성, 무결성, 가용성을 제공하는 것." (CNSS, 2010)

 

 "인가된 사용자만이(기밀성) 정확하고 완전한 정보로(무결성) 필요할 때 접근할 수 있도록(가용성) 하는 일련의 작업." (ISACA, 2008)

 

 "조직의 지적 자산을 보호하는 절차." (Pipkin, 2000)

 

 "...정보보안은 위험 관리 규율로, 사업의 정보 위험 가치를 관리하는 작업이다." (McDermott and Geer, 2001)

 

종합해보면, 정보보안은 정보자산에 대한 기밀성, 무결성, 가용성을 보장하기 위한 작업이다. 물론 이러한 작업에는 보안정책을 수립하고, 관리적, 물리적, 기술적 보안대책을 마련하는 등 세부사항들이 포함된다.

 

1.2 정보보안의 3요소

 

정보보안의 정의에서도 언급된바와 같이 정보보안의 3요소는 기밀성(Confidentiality), 무결성(Integrity), 가용성(Availability)이며, 약어로 CIA라고도 한다.

 

 

기밀성은 정보를 오직 인가된 사용자에게만 허가하는 것을 말한다. 중요 정보가 권한이 없는 일반인에게 공개되거나 혹은 접근되지 않도록 제한을 가한다는 의미다.

 

무결성은 부적절한 정보의 변경이나 파기 없이 정확하고 완전하게 보존된 것을 말한다. , 원래 저장된 정보에 변경이 발생하여 다른 정보와 일치하지 않는 부분이 있다면 이는 무결성이 깨진 상태다. 무결성은 세부적으로 정확성, 완전성, 일관성을 요한다.

 

마지막으로 가용성은 시기적절하면서 신뢰할 수 있는 정보로의 접근과 사용을 의미한다.

 

① 기밀성(Confidentiality) - 인가된 사람, 프로세스, 시스템만이 보호된 시스템에 접근해야 함

비 승인

② 무결성(Integrity) - 정보는 고의적인, 비인가된, 우연한 변경으로부터 보호되어야 함

③ 가용성(Availability) - 정보는 사용자가 필요로 하는 시점에 접근 가능해야 함

 

1.3 정보보안 관련 용어 정리

 

정보보안과 관련하여 빈번히 사용되지만 개념이 모호한 용어들에 대해서 정확히 숙지를 하고 있어야 정보보안에 대해서 이해하기가 수월하기 때문이다.

 

① 자산(Asset) - 데이터 혹은 자산의 소유자가 가치를 부여한 개체 (개인정보, 영업비밀, 기자재)

 위협원(Threat agents) - 정보자산에 해를 끼치는 행동을 할 수 있는 주체 (해커, 임직원, 단체, 자연재해)

 위협(Threat) - 자산에 대한 위협원의 공격 행동 (해킹, /변조, 삭제, 파손, 유출)

 취약점(Vulnerability) - 위협이 발생하기 위한 사전 조건/상황 (평문전송, 입력값 미검증, 비밀번호 공유)

 위험(Risk) - 위협원이 취약점을 이용하여 위협이라는 행동을 통해 자산에 악영향을 미치는 결과를 가져올 가능성

 

위험 = 자산의 가치 X 취약점 X 위협

 

위의 정보보안관련 용어를 좀더 이해하기 쉽게 도식화하면 [그림1.1]과 같다.

 

[그림1.1] 자산, 취약점, 위협, 위협원, 위험의 상호관계

 

자산 내에 크고 작은 보안 취약점들이 존재하며 해커 또는 악의적인 내부자 등 위협원에 의한 해킹, 정보유출, 시스템 파괴 등의 위협이 발생한다. 이를 종합하면, 위험이 발생할 확률은 자산의 가치가 높을수록, 취약점이 많을 수록, 위협의 대상에 노출될 수록 증가하며 위험으로 인해 자산에 악영향을 끼친다.

 

1.4 정보보안의 침해사고

 

최근 인터넷 쇼핑몰 "인터파크" 25 1,030만명의 고객 개인정보가 해커의 공격에 의해 유출된 사실을 밝혔다. 이번 정보보호 침해 사고는 APT 기반 공격에 의한 개인정보 유출 사례다. APT란 지능형 지속 위협(Advanced Persistent Threats)으로 개인 해커에 의한 공격이 아니라, 정보 또는 금전 및 특정 회사의 중요 정보 획득을 목적으로 범죄 그룹에 의해서 지속적으로 취약점과 목적을 가지고 해킹하는 방법을 의미한다.

 

2008년 2 4일 옥션 1,081, 2011 7 26일 네이트 3,500만 건의 개인정보 유출 사건이 APT 기반 공격으로 발생하고 있다. 아래는 역대 천만 건 이상 개인정보 유출 사건 피해 사례다.

 

 

이러한 침해사고의 문제는 점점 더 지능적인 수법이 동원되며 피해 규모 또한 커지고 있다는 것이다. 피해자들의 규모가 엄청난 만큼 기업에서 판결에 따라 배상해야 하는 금전적인 손해액이 클 뿐만 아니라 기업 이미지 훼손 등 무형의 손해까지 고려하면 기업 입장에서는 천문학적인 손해가 발생한다고 할 수 있다.

 

또한 정보통신망법과 7 25일 개인정보보호법 개정을 통하여 "개인정보 유출에 대한 징벌적 손해배상 제도"가 시행되면서 개인정보를 고의적으로 유출시킨 기관과 사업자 등에게는 실제 손해액을 초과하여 최대 3배까지 배상하도록 하는 징벌적 손해배상제도가 도입 됨에 따라 기업의 피해는 더 커질 수 있다. 보안이 단순한 기술의 범주에 머물러 있는 것이 아니라 기업의 생과 사에 영향을 미칠 수 있다는 것을 시사한다.

 

이렇게 침해사고의 빈도 수가 늘어나고 피해 규모도 커짐에 따라 정보보호(보안)의 필요성이 높아지고 있다. 그런데 "보안성을 높인다"라고 할 때 그것이 어떠한 특성을 지니고 있는지 개념을 정확이 알아야 정보보호 관련 대책을 수립할 수 있다.

 

정보보호는 "정보자산을 공개/노출, 변경/파괴, 지체/재난 등의 위협으로 부터 보호하여 정보의 기밀성, 무결성, 가용성을 확보하는 것으로 정의할 수 있다.

 

정보자산이란 좁은 의미로는 정보 그 자체만을 의미하지만 넓은 의미로는 그 정보를 포함해 정보를 생성, 가공 및 저장하는 설비를 모두 포함한다.

 

일반적으로 기업의 정보자산은 정보 및 데이터, 하드웨어, 소프트웨어, 물리적 환경, 인적 자산 등으로 분류할 수 있으며 서비스, 기업 이미지 또는 브랜드 가치 등도 보호해야 할 중요한 대상이 된다.

 

정보는 데이터에서 나온다. 그러나 데이터에서 나온 모든 것이 정보가 되는 것은 아니다. 데이터가 정보가 되기 위해서는 의미가 부여되어야 하는 것이다. , 데이터(Data)가 가공하기 전의 순수한 상태의 수치들 이라면 정보(Information)는 유의미하게 가공된 2차 데이터의 형태인 것이다. 만약 기업이라면 기업이 보유한 핵심 기술이 될 것이고, 행정 기관이라고 한다면 민원인의 개인 정보 등이 될 것이다. 참고로 지식(Knowledge)은 정보의 이용에 대한 노하우로 정보에 가치가 더해진 것이고 지혜(Wisdom)는 지식을 실생활에서 활용하는 것을 말한다.

 

1.5 정보보안의 대비책

 

정보보안이 단순한 기술의 범주에 머물러 있는 것이 아니라 기업의 생과 사에 영향을 미칠 수 있기 때문에 보안 사고를 막기 위한 대비책은 다음과 같다.

 

① 기밀성은 비 승인 사용자의 데이터베이스 접근이나 개인정보를 포함한 파일의 외부 유출은 기밀성을 훼손시키는 공격이다. 이에 대한 대책으로 PC를 끄고 퇴근하는 보안 정책의 적용이나 자료 유출 방지 솔루션의 사용을 들 수 있겠다.

 

② 무결성은 악성 코드가 포함된 파일을 내려 받게 되거나 악성 코드가 포함된 소프트웨어를 설치하면 무결성이 깨지게 된다. 따라서 악성코드 탐지와 차단 솔루션을 사용하고 비승인 소프트웨어의 사용과 설치를 금지하는 보안 솔루션을 사용해야 한다.

 

③ 가용성은 대표적으로 가용성을 노리는 공격으로 DDOS 공격을 들 수 있다. 이를 막기 위해 DDOS 차단 장비를 사용하고 트래픽을 제어하는 정책을 사용하는 등의 대비책이 있겠다.

 

보안성을 강화하는 것은 기술적인 대안인 보안 제품을 사용하는 것도 있지만 보안 정책도 필요하다는 것에 주목을 해야 할 것이다.

 

최근 인터파크 개인자료 유출 사례에서도 보듯이 해킹 기술은 APT 공격을 비롯하여 계속 발전하고 새로워져 기존의 보안 제품만으로는 막을 수 없기 때문이다. 조직이 자신에게 적합한 보안 정책을 수립하고 그에 의해 보안관련 조직을 구성하여 일련의 보안 활동을 수행하는 것을 보안 거버넌스(Security Governance)라고 한다. 보안 담당자가 보안 솔루션만을 맹신하는 것은 금물이며 각 기업의 상황을 잘 파악하여 적절한 보안 거버넌스를 구축하는 것이 중요하다.

 

1.6 정보보안의 주요 법령과 규정

 

정보보안의 주요 법령은 "정보통신망 이용촉진 및 정보보호 등 에 관한 법률", "신용정보의 이용 및 보호에 관한 법률", "공공기관의 개인정보보호에 관한 법률" 등으로 나누어 볼 수 있다.

 

정보보안의 정보통신망법의 개인정보보호 관련 벌칙 규정은 다음과 같다.

 

 

1.7 개인정보 암호화 대상 항목

 

개인정보를 보호하기 위한 필수 암호화 대상이 되는 항목은 다음과 같다.

 

 

2. PostgreSQL 암복호화 모듈

 

2.1 pgcrypto 모듈

 

pgcrypto 모듈은 PostgreSQL을 위한 암호화 기능을 제공한다.

 

이 모듈은 신뢰할 수 있는 모듈로 간주 된다. , 현재 데이터베이스에 대한 CREATE 권한이 있는 슈퍼 유저가 아닌 사용자가 설치할 수 있다 .

 

pgcrypto 모듈의 Raw 암호화 함수는 다음과 같다.

- convert_to/convert_from : 문자열 변환/복원

- encode/decode : 16진수 인코딩/디코딩

- encrypt/decrypt : 암호화/복호화

 

암호화는 utf8로 변환한 후, 암호화 키로 'aes' 알고리즘을 사용하여 암호화한 후, 그 값을 16진수(hex) encoding 한다.

 

) encode(encrypt(convert_to('이름005', 'utf8'), 'ENC_KEY', 'aes'), 'hex')

 

ENC_KEY는 실제 사용할 암호화 KEY로 대체해야 하며, utf8, aes, hex는 고정값임

 

복호화는 암호화의 역순. 16진수값을 decoding한 후 암호화를 해제하고, 그 값을 다시 utf8에서 변환한다.

 

) convert_from(decrypt(decode(mem_name,'hex'),'ENC_KEY','aes'),'utf8')

 

ENC_KEY는 실제 사용할 복호화 KEY로 대체해야 하며, utf8, aes, hex는 고정값임

 

 

2.2 암복호화 함수

 

1) TO_ENCRYPTS 함수

 

- NAME

  TO_ENCRYPTS

 

- SYNOPSIS

  char    TO_ENCRYPTS(data char)

varchar TO_ENCRYPTS(data varchar)

txt     TO_ENCRYPTS(data text)

 

- DESCRIPTION

  데이터를 암호화 하는 함수

  data : 암호화할 데이터

 

- RETURN VALUES

  암호화한 데이터를 반환

 

2) TO_DECRYPTS 함수

 

- NAME

  TO_DECRYPTS

 

- SYNOPSIS

char    TO_DECRYPTS(data char)

varchar TO_DECRYPTS(data varchar)

txt     TO_DECRYPTS(data text)

 

- DESCRIPTION

  데이터를 복호화 하는 함수

  data : 복호화할 데이터

 

- RETURN VALUES

  복호화한 데이터를 반환

 

 

2.3 암복호화 함수 생성

 

1) 확장 모듈 설치

 

postgres=# CREATE EXTENSION pgcrypto;
CREATE EXTENSION
postgres=#

 

2) 암복호화 함수 생성

 

postgres=# CREATE OR REPLACE FUNCTION TO_ENCRYPTS(data char)
postgres-# RETURNS char AS
postgres-# $$ BEGIN
postgres$#     RETURN encode(encrypt(convert_to(data, 'utf8'), '암호화 KEY', 'aes'), 'hex');
postgres$# END; $$
postgres-# LANGUAGE PLPGSQL;
CREATE FUNCTION
postgres=# CREATE OR REPLACE FUNCTION TO_DECRYPTS(data char)
postgres-# RETURNS char AS
postgres-# $$ BEGIN
postgres$#     RETURN convert_from(decrypt(decode(data, 'hex'), '복호화 KEY', 'aes'), 'utf8');
postgres$# END; $$
postgres-# LANGUAGE PLPGSQL;
CREATE FUNCTION
postgres=# CREATE OR REPLACE FUNCTION TO_ENCRYPTS(data varchar)
postgres-# RETURNS varchar AS
postgres-# $$ BEGIN
postgres$#     RETURN encode(encrypt(convert_to(data, 'utf8'), '암호화 KEY', 'aes'), 'hex');
postgres$# END; $$
postgres-# LANGUAGE PLPGSQL;
CREATE FUNCTION
postgres=# CREATE OR REPLACE FUNCTION TO_DECRYPTS(data varchar)
postgres-# RETURNS varchar AS
postgres-# $$ BEGIN
postgres$#     RETURN convert_from(decrypt(decode(data, 'hex'), '복호화 KEY', 'aes'), 'utf8');
postgres$# END; $$
postgres-# LANGUAGE PLPGSQL;
CREATE FUNCTION
postgres=# CREATE OR REPLACE FUNCTION TO_ENCRYPTS(data text)
postgres-# RETURNS text AS
postgres-# $$ BEGIN
postgres$#     RETURN encode(encrypt(convert_to(data, 'utf8'), '암호화 KEY', 'aes'), 'hex');
postgres$# END; $$
postgres-# LANGUAGE PLPGSQL;
CREATE FUNCTION
postgres=# CREATE OR REPLACE FUNCTION TO_DECRYPTS(data text)
postgres-# RETURNS text AS
postgres-# $$ BEGIN
postgres$#     RETURN convert_from(decrypt(decode(data, 'hex'), '복호화 KEY', 'aes'), 'utf8');
postgres$# END; $$
postgres-# LANGUAGE PLPGSQL;
CREATE FUNCTION
postgres=#

 

 

2.4 암복호화 함수 생성 확인

 

postgres=# \df
                                        List of functions
 Schema |         Name          | Result data type  |        Argument data types         |  Type 
--------+-----------------------+-------------------+------------------------------------+--------
 public | armor                 | text              | bytea                              | normal
 public | armor                 | text              | bytea, text[], text[]              | normal
 public | crypt                 | text              | text, text                         | normal
 public | dearmor               | bytea             | text                               | normal
 public | decrypt               | bytea             | bytea, bytea, text                 | normal
 public | decrypt_iv            | bytea             | bytea, bytea, bytea, text          | normal
 public | digest                | bytea             | bytea, text                        | normal
 public | digest                | bytea             | text, text                         | normal
 public | encrypt               | bytea             | bytea, bytea, text                 | normal
 public | encrypt_iv            | bytea             | bytea, bytea, bytea, text          | normal
 public | gen_random_bytes      | bytea             | integer                            | normal
 public | gen_random_uuid       | uuid              |                                    | normal
 public | gen_salt              | text              | text                               | normal
 public | gen_salt              | text              | text, integer                      | normal
 public | hmac                  | bytea             | bytea, bytea, text                 | normal
 public | hmac                  | bytea             | text, text, text                   | normal
 public | pgp_armor_headers     | SETOF record      | text, OUT key text, OUT value text | normal
 public | pgp_key_id            | text              | bytea                              | normal
 public | pgp_pub_decrypt       | text              | bytea, bytea                       | normal
 public | pgp_pub_decrypt       | text              | bytea, bytea, text                 | normal
 public | pgp_pub_decrypt       | text              | bytea, bytea, text, text           | normal
 public | pgp_pub_decrypt_bytea | bytea             | bytea, bytea                       | normal
 public | pgp_pub_decrypt_bytea | bytea             | bytea, bytea, text                 | normal
 public | pgp_pub_decrypt_bytea | bytea             | bytea, bytea, text, text           | normal
 public | pgp_pub_encrypt       | bytea             | text, bytea                        | normal
 public | pgp_pub_encrypt       | bytea             | text, bytea, text                  | normal
 public | pgp_pub_encrypt_bytea | bytea             | bytea, bytea                       | normal
 public | pgp_pub_encrypt_bytea | bytea             | bytea, bytea, text                 | normal
 public | pgp_sym_decrypt       | text              | bytea, text                        | normal
 public | pgp_sym_decrypt       | text              | bytea, text, text                  | normal
 public | pgp_sym_decrypt_bytea | bytea             | bytea, text                        | normal
 public | pgp_sym_decrypt_bytea | bytea             | bytea, text, text                  | normal
 public | pgp_sym_encrypt       | bytea             | text, text                         | normal
 public | pgp_sym_encrypt       | bytea             | text, text, text                   | normal
 public | pgp_sym_encrypt_bytea | bytea             | bytea, text                        | normal
 public | pgp_sym_encrypt_bytea | bytea             | bytea, text, text                  | normal
 public | to_decrypts           | character         | data character                     | normal
 public | to_decrypts           | character varying | data character varying             | normal
 public | to_decrypts           | text              | data text                          | normal
 public | to_encrypts           | character         | data character                     | normal
 public | to_encrypts           | character varying | data character varying             | normal
 public | to_encrypts           | text              | data text                          | normal
(42 rows)
postgres=#

 

 

2.5 암복호화 함수 테스트

 

1) 암호화 함수(TO_ENCRYPTS)

 

postgres=# SELECT TO_ENCRYPTS('qwer1234');
           to_encrypts           
----------------------------------
 2b9a5a43f720621f1c791f8882a75195
(1 row)
postgres=#

 

 

 

 

2) 복호화 함수(TO_DECRYPTS)

 

postgres=# SELECT TO_DECRYPTS('2b9a5a43f720621f1c791f8882a75195');
 to_decrypts
-------------
 qwer1234
(1 row)
postgres=#

 

 

 

 

3. About BaroCRYPT

 

 

 

 

Version 1.0 - Official Release - 2016.12.1

Copyright ⓒ Nurit corp. All rights reserved.

http://www.nurit.co.kr

 

제 조 사 : 주식회사 누리아이티
등록번호 : 258-87-00901
대표이사 : 이종일
이 메 일 : mc529@nurit.co.kr
주    소 : 서울시 강서구 마곡중앙2로 15, 913호(마곡동, 마곡테크노타워2)

조달총판 : 주식회사 루시드네트웍스
등록번호 : 848-86-00615
대표이사 : 박병호
대표전화 : 031-8018-4770(영업문의) / 031-8018-4771(기술지원)
이 메 일 : sales@lucidnet.co.kr
주    소 : 경기도 하남시 미사대로520, CA동 904,905호(덕풍동, 현대지식산업센터 한강미사2차)

공 급 사 : 주식회사 트루인테크놀로지스
등록번호 : 314-86-56237
대표이사 : 손원찬
대표전화 : 010-3404-1156(영업문의) / 080-488-8803(기술지원)
이 메 일 : wcson@truin.kr
주    소 : 대전시 서구 문예로 137, 4층(둔산동, 케이티엔지대전빌딩)

공 급 사 : 주식회사 디에이치솔루션
등록번호 : 606-86-54064
대표이사 : 조동환
대표전화 : 051-323-0705(영업문의) / 070-4632-0869(기술지원)
이 메 일 : sales@dhsolution.kr
주    소 : 부산시 해운대구 센텀동로 71, 벽산e센텀클래스원2차 1105호

공 급 사 : 주식회사 반디데이타
등록번호 : 264-81-49402
대표이사 : 백욱인
대표전화 : 02-864-5653(영업문의, 기술지원)
이 메 일 : bandidata@bandidata.com
주    소 : 서울시 금천구 벚꽃로 278, 1503호(가산동, SJ테크노빌)