치환 암호화 웹 서비스

나만의 규칙으로 메시지를 암호화하고 복호화하세요

프로젝트 개요

“테이블 이름으로 암호화/복호화하자”에서 출발해, 학습용 치환 로직을 거쳐 Fernet 대칭키 기반 보안 구조로 고도화했습니다. API·서비스·모델을 분리하고, 키 관리/백업·복원/테스트 체계를 정비해 운영 안정성과 확장성을 확보했습니다.

서비스 화면

암호화 폼
복호화 폼

주요 기능

사용자 정의 테이블(보안 저장)

  • name 기반 테이블 생성/조회, JSON 직렬화 후 Fernet로 암호화 저장
  • name UNIQUE 제약, 소유자 검증 및 길이/문자 검증

레거시 치환 암호화(데모)

  • 줄 개수 기반 시프트 → 역순 → base64 (학습용)
  • 프로덕션 사용 비권장(명시적 경고 배너 표시)

Fernet 기반 메시지 암·복호

  • Fernet(AES-CBC + HMAC)으로 인증·암호화
  • (선택) 메시지 TTL 검증, Passphrase→Argon2id KDF로 키 유도

모듈러 아키텍처 & 테스트

  • Flask routes ↔ 서비스(crypto/table) ↔ 모델 완전 분리
  • 핵심 함수는 순수 함수로 유닛 테스트 용이

운영 안전장치

  • 레이트 리밋·입력 길이 제한·요청 로그(민감정보 마스킹)
  • 키 ID(KID)·버전·타임스탬프 관리, 백업/복원 시 검증

아키텍처 구성도

architecture-0
  • React 프론트엔드 → Flask API(routes.py)
  • routes → crypto_service.py / table_service.py 위임
  • 테이블: JSON → Fernet 암호화(blob) → substitution_table 모델에 저장(name UNIQUE, kid, version, created_at)
  • 키: 환경변수/비밀 저장소에서 로드, (선택) 키 링·로테이션(KID)
  • 백업/복원: admin/backup_restore.py (무결성 체크, 중복 name 방지)
  • 보안: HTTPS, 레이트 리밋, 입력 검증, 민감정보 비로그

기술 스택

백엔드: Python, Flask, SQLAlchemy, cryptography(Fernet) 프론트엔드: React 데이터베이스: SQLite(로컬), PostgreSQL(확장) 인프라: Docker, Gunicorn, Nginx 보안/키관리: .env/비밀 저장소, (선택) 키 로테이션(KID), Argon2id KDF 테스트/문서: pytest, Swagger(OpenAPI)

담당 역할

문제 해결 및 성과

회고 / 느낀 점