CodeGym /행동 /SQL SELF /pgcrypto 데이터 암호화 소개

pgcrypto 데이터 암호화 소개

SQL SELF
레벨 48, 레슨 1
사용 가능

데이터 유출 얘기 들어봤어? 오, 이거 그냥 헐리우드 영화에만 나오는 얘기가 아니야. 회사들은 데이터 유출 때문에 수백만 달러를 날리고, 평판도 카드 집처럼 무너져. 이런 일이 안 생기게 하려면, 데이터를 꼭 보호해야 해. 그중에서도 제일 강력한 방법이 바로 암호화야.

암호화는 데이터를 "비밀 코드"로 바꿔서, 복호화 키 없이는 아무도 못 알아보게 만드는 방법이야. PostgreSQL에는 pgcrypto라는 멋진 확장 기능이 있는데, 이걸로 데이터 암호화가 훨씬 쉬워져.

pgcrypto는 PostgreSQL 확장 기능으로, 데이터 암호화/복호화, 해시 작업, 랜덤 데이터 생성 등 강력한 도구들을 제공해.

pgcrypto의 주요 기능:

  1. 대칭(키 하나) 및 비대칭(키 쌍: private, public) 방식의 암호화.
  2. 데이터 해싱(예: 비밀번호 검증용).
  3. 토큰, 키, 비밀번호 생성에 쓸 수 있는 랜덤 데이터 생성.

이렇게 pgcrypto를 DB에 연결할 수 있어. 마법은 해리포터만 쓰는 줄 알았으면, PostgreSQL이 얼마나 신기한지 보여줄게.

-- pgcrypto 확장 기능 연결
CREATE EXTENSION IF NOT EXISTS pgcrypto;

대칭 암호화: 너의 비밀을 암호화하자

암호화/복호화 함수들:

  1. pgp_sym_encrypt(data, key) — 대칭 키로 데이터 암호화.
  2. 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가 아무리 안전해 보여도, 항상 해시를 써야 해.

비대칭 암호화: 키 두 개가 하나보다 낫다

비대칭 암호화는 두 개의 키를 써:

  1. 공개 키(암호화용).
  2. 비공개 키(복호화용).

예시: 공개 키로 암호화하기

-- 키 쌍 생성(간단하게 변수에 저장)
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 활용 시나리오

  1. 민감한 데이터 암호화:
  • 신용카드 번호.
  • 고객 개인정보(예: 주소, 전화번호).
  • 의료 기록.
  1. 비밀번호 해싱: DB 관리자도 사용자 비밀번호를 못 보게 해.

  2. 데이터 안전 전송: 비대칭 암호화로 암호화된 정보 전송.

  3. 토큰 생성: API 사용자 인증용 토큰 만들기.

암호화 작업할 때 자주 하는 실수

키를 아무데나 저장함. 암호화 키를 DB에 평문으로 저장하지 마. 시크릿 매니저 같은 걸 써야 해.

약한 키 사용. 암호화 키가 너무 짧으면 금방 뚫려.

쓸데없이 암호화함. 암호화는 리소스를 더 먹으니까, 꼭 필요한 곳에만 써야 해.

어떤 키 썼는지 까먹음. 문서화 안 해두면, 나중에 데이터 복호화 못 할 수도 있어.

암호화는 어렵다기보단, 데이터 보호를 위한 당연한 단계야. pgcrypto를 프로젝트에 꼭 써서, DB를 더 안전하게 만들고, 요즘 세상에서 요구하는 기준에도 맞춰보자. PostgreSQL은 데이터를 철벽 요새로 만들어줄 모든 도구를 제공해!

2
과제
SQL SELF, 레벨 48, 레슨 1
잠금
대칭 암호화를 이용한 데이터 암호화 및 복호화
대칭 암호화를 이용한 데이터 암호화 및 복호화
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION