데이터 유출 얘기 들어봤어? 오, 이거 그냥 헐리우드 영화에만 나오는 얘기가 아니야. 회사들은 데이터 유출 때문에 수백만 달러를 날리고, 평판도 카드 집처럼 무너져. 이런 일이 안 생기게 하려면, 데이터를 꼭 보호해야 해. 그중에서도 제일 강력한 방법이 바로 암호화야.
암호화는 데이터를 "비밀 코드"로 바꿔서, 복호화 키 없이는 아무도 못 알아보게 만드는 방법이야. PostgreSQL에는 pgcrypto라는 멋진 확장 기능이 있는데, 이걸로 데이터 암호화가 훨씬 쉬워져.
pgcrypto는 PostgreSQL 확장 기능으로, 데이터 암호화/복호화, 해시 작업, 랜덤 데이터 생성 등 강력한 도구들을 제공해.
pgcrypto의 주요 기능:
- 대칭(키 하나) 및 비대칭(키 쌍: private, public) 방식의 암호화.
- 데이터 해싱(예: 비밀번호 검증용).
- 토큰, 키, 비밀번호 생성에 쓸 수 있는 랜덤 데이터 생성.
이렇게 pgcrypto를 DB에 연결할 수 있어. 마법은 해리포터만 쓰는 줄 알았으면, PostgreSQL이 얼마나 신기한지 보여줄게.
-- pgcrypto 확장 기능 연결
CREATE EXTENSION IF NOT EXISTS pgcrypto;
대칭 암호화: 너의 비밀을 암호화하자
암호화/복호화 함수들:
pgp_sym_encrypt(data, key)— 대칭 키로 데이터 암호화.pgp_sym_decrypt(data, key)— 같은 키로 암호화된 데이터 복호화.
예시: 간단한 텍스트 암호화
예를 들어, users 테이블에 email 컬럼이 있고, 이메일 주소를 암호화하고 싶다고 해보자.
-- users 테이블 생성
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT
);
-- 데이터 삽입
INSERT INTO users (email)
VALUES ('user1@example.com'), ('user2@example.com');
-- 데이터 암호화
UPDATE users
SET email = pgp_sym_encrypt(email, 'supersecretkey');
-- 결과 확인
SELECT * FROM users;
결과: email 컬럼에는 이제 의미 없는 문자 뭉치처럼 보이는 암호화된 텍스트가 저장돼.
데이터 복호화
원래 데이터로 돌리고 싶으면 pgp_sym_decrypt 함수를 써.
-- 데이터 복호화
SELECT pgp_sym_decrypt(email::bytea, 'supersecretkey') AS original_email
FROM users;
참고: 키는 절대 대충 만들지 마. "123456" 같은 키는 그냥 문 열어놓고 비밀번호 걸어놓는 거랑 똑같아. 길고 복잡한 키를 써!
데이터 해싱: 비밀번호 보호 끝판왕
비밀번호를 DB에 평문으로 저장하는 건, 다인실에서 일기장을 베개 밑에 숨기는 거랑 똑같아. 절대 그러지 마! 대신 해싱을 써야 해.
해싱 함수: crypt(password, gen_salt('bf')) — password 문자열을 Blowfish 알고리즘으로 해시해.
-- 비밀번호 해싱 예시
SELECT crypt('my_password', gen_salt('bf'));
결과는 대충 이렇게 나와: $2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi.
비밀번호를 확인하려면 똑같은 함수 써:
-- 비밀번호 확인
SELECT crypt('my_password', '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi')
= '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi';
결과: true.
팁: 비밀번호는 절대 평문으로 저장하지 마. DB가 아무리 안전해 보여도, 항상 해시를 써야 해.
비대칭 암호화: 키 두 개가 하나보다 낫다
비대칭 암호화는 두 개의 키를 써:
- 공개 키(암호화용).
- 비공개 키(복호화용).
예시: 공개 키로 암호화하기
-- 키 쌍 생성(간단하게 변수에 저장)
DO $$
DECLARE
public_key TEXT;
private_key TEXT;
BEGIN
SELECT pgp_keygen_keys(1024, 'my_passphrase')
INTO public_key, private_key;
RAISE NOTICE 'Public Key: %', public_key;
RAISE NOTICE 'Private Key: %', private_key;
END $$;
비대칭 암호화 활용
요즘 시스템들은 데이터 교환할 때 비대칭 암호화를 많이 써. 예를 들어 SSL 연결 같은 거 말이야.
랜덤 데이터 생성
토큰이나 랜덤 키를 만들고 싶으면 gen_random_uuid나 gen_random_bytes 함수를 써.
예시:
-- 랜덤 UUID 생성
SELECT gen_random_uuid();
-- 랜덤 바이트 배열 생성
SELECT gen_random_bytes(16);
이건 고유 식별자, 액세스 토큰, 랜덤 비밀번호 만들 때 유용해.
pgcrypto 활용 시나리오
- 민감한 데이터 암호화:
- 신용카드 번호.
- 고객 개인정보(예: 주소, 전화번호).
- 의료 기록.
비밀번호 해싱: DB 관리자도 사용자 비밀번호를 못 보게 해.
데이터 안전 전송: 비대칭 암호화로 암호화된 정보 전송.
토큰 생성: API 사용자 인증용 토큰 만들기.
암호화 작업할 때 자주 하는 실수
키를 아무데나 저장함. 암호화 키를 DB에 평문으로 저장하지 마. 시크릿 매니저 같은 걸 써야 해.
약한 키 사용. 암호화 키가 너무 짧으면 금방 뚫려.
쓸데없이 암호화함. 암호화는 리소스를 더 먹으니까, 꼭 필요한 곳에만 써야 해.
어떤 키 썼는지 까먹음. 문서화 안 해두면, 나중에 데이터 복호화 못 할 수도 있어.
암호화는 어렵다기보단, 데이터 보호를 위한 당연한 단계야. pgcrypto를 프로젝트에 꼭 써서, DB를 더 안전하게 만들고, 요즘 세상에서 요구하는 기준에도 맞춰보자. PostgreSQL은 데이터를 철벽 요새로 만들어줄 모든 도구를 제공해!
GO TO FULL VERSION