topic난이도 · 약 25

암호화 · 해시 · TLS 실전

대칭(AES) · 비대칭(RSA/ECDSA) · 해시(SHA/bcrypt) · TLS 1.3 핸드셰이크 — 알고 쓰자.

#AES#RSA#ECDSA#SHA-256#HMAC#TLS1.3
왜 배우는가

ch16-4에서 해시 vs 암호화 개념은 봤다. 여기선 "뭘 언제 쓰나"를 실전 기준으로 정리. Claude가 만든 암호화 코드가 맞는지 볼 수 있다.

암호화 세 축.대칭(같은 키로 암호·복호) — AES. 빠르지만 키 공유 문제. ② 비대칭(공개키로 암호, 개인키로 복호) — RSA·ECDSA. 느리지만 키 공유 문제 해결. ③ 하이브리드 — 비대칭으로 세션키 교환 후 대칭으로 대량 전송. TLS가 이 방식.

알고리즘종류특징쓰는 곳
AES-256-GCM대칭빠름 + 인증 태그(무결성)파일 암호화, DB 필드
ChaCha20-Poly1305대칭모바일·저사양에 빠름TLS 1.3, WireGuard
RSA비대칭2048~4096비트, 느림옛 TLS, 서명
ECDSA / Ed25519비대칭짧고 빠름현대 TLS 인증서, SSH 키
SHA-256해시빠름, 무결성파일 지문, Git 커밋
bcrypt / argon2느린 해시비밀번호 전용로그인 저장
typescript
import crypto from "node:crypto";

// ━━━ 1) 대칭 암호화 (AES-256-GCM) — 민감 DB 필드·파일 ━━━
function encrypt(plain: string, key: Buffer) {
  const iv = crypto.randomBytes(12);             // IV는 매번 랜덤
  const cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
  const enc = Buffer.concat([cipher.update(plain, "utf8"), cipher.final()]);
  const tag = cipher.getAuthTag();               // 무결성 태그
  return Buffer.concat([iv, tag, enc]).toString("base64");
}
function decrypt(b64: string, key: Buffer) {
  const buf = Buffer.from(b64, "base64");
  const iv  = buf.subarray(0, 12);
  const tag = buf.subarray(12, 28);
  const enc = buf.subarray(28);
  const d = crypto.createDecipheriv("aes-256-gcm", key, iv);
  d.setAuthTag(tag);
  return Buffer.concat([d.update(enc), d.final()]).toString("utf8");
}

// ━━━ 2) 해시 (파일 무결성) ━━━
const sig = crypto.createHash("sha256").update(fileBuffer).digest("hex");

// ━━━ 3) HMAC (메시지 인증 — 시크릿 키로 서명) ━━━
const mac = crypto.createHmac("sha256", secret).update(payload).digest("hex");
// 웹훅 검증, JWT 서명에 사용

// ━━━ 4) 비대칭 키 쌍 생성 + 서명 ━━━
const { publicKey, privateKey } = crypto.generateKeyPairSync("ed25519");
const signature = crypto.sign(null, Buffer.from("hello"), privateKey);
const ok = crypto.verify(null, Buffer.from("hello"), publicKey, signature);

Claude가 만든 crypto 코드에서 `aes-256-cbc`만 쓰고 인증 태그가 없으면 GCM으로 교체 요청. CBC는 무결성 없어서 비트 플리핑 공격 가능.

키 관리가 알고리즘보다 중요. AES-256도 키가 Git 저장소에 있으면 무용지물. 운영 환경에선 AWS KMS · HashiCorp Vault · 환경변수(.env, 접근 제한)로 관리. `.env`는 절대 `git push` 금지.

TLS 1.3 실전. 2018년 표준. 핸드셰이크 1-RTT, 취약 암호 모두 제거. 2026년 기준 신규 배포는 최소 TLS 1.2, 권장 1.3. HSTS 헤더로 HTTP 접근 아예 차단.

bash
# 내 사이트 TLS 설정 감사
curl -v https://jit-learning.com 2>&1 | grep -E "SSL|TLS"
# * SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256  ← 좋음

# 더 상세한 감사 (무료)
# https://www.ssllabs.com/ssltest/analyze.html?d=jit-learning.com

# HSTS 헤더 (권장)
# Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Vercel·Cloudflare는 자동으로 TLS 1.3 + HSTS 세팅. 직접 서버 운영 시 Nginx/Caddy에 명시.

실기 드릴 2문항
edit실기 드릴 · 단답형

대량 데이터를 빠르게 암호화하며 무결성까지 보장하는 AES 모드는?

check_circle실기 드릴 · OX

TLS 1.3은 핸드셰이크 RTT 수가 TLS 1.2보다 적다.