현재 진행중인 프로젝트에서 대칭키인 AES로 암호화되는 휴대전화번호와 한전고객번호를 비대칭키 방식의 RSA 키로 전환하는 것을 고려하고 있었다. 그런데, 전달받은 RSA 공개키와 비밀키 파일에는 일반적으로 RSA 키를 만들었을때 포함되는 블록이 아니었다. 키 파일에 포함된 PGP PUBLIC KEY BLOCK
는 무엇일까?
OpenPGP
GPG(GNU Privacy Guard)는 RFC 4880
표준으로 정의된 데이터 암호화 방식이다. 조직에서 개발용으로 전달받은 RSA 공개키와 비밀키는 일반적인 RSA 키와 다르게 PGP 헤더 블록으로 포함되어 있었다. 이 RSA 키페어는 맥 OS에서 gnupg를 설치해서 GPG 키를 생성한 것으로 보인다. 깃허브 커밋에도 GPG 키를 사용해서 커밋을 서명하는데에도 사용할 수 있나보다. 아무튼 이메일 보안을 위해 사용하던 PGP를 오픈소스화 하여 공유된 것이 GPG인가 보다.
Ascii Armor
PostgreSQL의 pycrypto 모듈에서는 데이터 암복화를 해야할 때 PGP 암호화 함수를 사용하는데 이 과정에서 armor와 dearmor 라는 함수로 PGP ASCII-armor 형식의 키를 bytea
형태로 변환하여 함수 파라미터로 전달하게 된다. 만약, 자바 애플리케이션에서 데이터베이스 함수를 호출할 때 데이터 암복호화를 위한 공개키 또는 비밀키를 바이트 배열로 전달한다면 Bouncy Castle을 사용해서 아스키 아머가 풀어진 형태로 호출할 수 있다. 간단하게 말해서, 아스키 아머는 Base64처럼 아스키코드로 보호된 형태로 안전하게 전달하기 위한 것으로 생각하면 된다.
RDS Slow Query
AWS RDS 또는 Aurora DB를 사용하는 환경이라면 애플리케이션 레이어에서 데이터베이스 호출할 때 데이터 암복호화에 사용되는 공개키와 비밀키를 파라미터로 전달할 때 크리티컬한 문제가 있을 수 있다. 만약, 2초 이상 소요되는 슬로우 쿼리가 감지될 때 SELECT 또는 프로시저 호출인 경우에는 전달되는 모든 파라미터의 값이 로그 메시지로 포함된다. 그러니까, 사용자의 민감한 개인정보의 보호를 위해 데이터 암호화에 사용되는 키가 그대로 노출될 수 있다
는 이야기이기 때문에 보안 관점에서는 문제가 될 수 있는 부분이다.