0Pricing
Cryptology Academy · 강의

흔한 Python 암호화 실수와 안전한 패턴

키 하드코딩, ECB 모드, 상수 시간이 아닌 비교 등의 문제를 피합니다.

흔한 Python 암호화 실수와 안전한 패턴은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cryptology Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

가장 위험한 암호화 실수

암호화는 잘못 사용하기 쉽습니다. Python에서 가장 흔한 함정은 키 하드코딩, ECB 모드, 일정 시간으로 실행되지 않는 비교, 취약한 난수 생성, 키 또는 논스 재사용, 암호화를 직접 구현하는 것입니다.

함정 1: 키 하드코딩

소스 코드에 키를 절대 삽입하지 마십시오. 키는 git 기록, 로그, 오류 메시지에 남게 됩니다. 환경 변수 또는 KMS를 사용하십시오.

# WRONG
SECRET_KEY = b"my_secret_key_12"  # visible in git!

# RIGHT
import os
SECRET_KEY = os.environb.get(b"SECRET_KEY") or os.urandom(32)
# Or load from KMS at startup

함정 2: ECB 모드

AES-ECB는 각 블록을 독립적으로 암호화하므로 동일한 평문 블록은 동일한 암호문 블록을 생성합니다. "ECB 펭귄" 공격은 이미지와 구조화된 데이터의 패턴을 드러냅니다. 항상 GCM을 사용하거나 무작위 IV와 함께 CBC를 사용하십시오.

# WRONG — never use ECB
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
cipher = Cipher(algorithms.AES(key), modes.ECB())  # insecure!

# RIGHT
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
aesgcm = AESGCM(key)  # authenticated encryption

함정 3: 일정 시간이 아닌 MAC 비교

==을 사용해 MAC을 비교하면 시간 정보가 유출됩니다. 항상 hmac.compare_digest를 사용하십시오.

import hmac

# WRONG — leaks timing
if received_mac == expected_mac:
    pass

# RIGHT — constant-time
if hmac.compare_digest(received_mac, expected_mac):
    pass

함정 4: 취약한 난수 생성

암호학적 용도로 random 모듈을 절대 사용하지 마십시오. 이 모듈은 CSPRNG가 아닙니다. secrets 또는 os.urandom을 사용하십시오.

import random, secrets, os

# WRONG
key = bytes([random.randint(0, 255) for _ in range(32)])  # predictable!

# RIGHT
key = os.urandom(32)          # OS CSPRNG
token = secrets.token_bytes(32)  # secrets module wrapper

함정 5: IV/논스 재사용

CBC에서 IV를 재사용하거나 GCM에서 논스를 재사용하면 보안이 무너집니다. 암호화할 때마다 새로운 무작위 IV/논스를 생성하고 암호문과 함께 저장하십시오.

import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)

# WRONG — fixed nonce
nonce = b"\x00" * 12  # reuse breaks GCM!

# RIGHT — fresh nonce every time
nonce = os.urandom(12)
ciphertext = aesgcm.encrypt(nonce, b"data", None)

함정 6: 보안에 MD5 또는 SHA-1 사용

MD5와 SHA-1은 충돌 저항성 측면에서 암호학적으로 안전하지 않습니다. 디지털 서명, 인증서 지문 또는 HMAC에 절대 사용하지 마십시오. SHA-256 또는 SHA-3-256을 사용하십시오.

함정 7: 암호화 직접 구현

암호화 기본 요소를 처음부터 구현하면 거의 항상 미묘한 버그가 발생합니다. cryptography, PyNaCl 또는 PyCA 패키지를 사용하십시오. AES, RSA 또는 ECDSA를 직접 구현하지 마십시오.

안전한 패턴: 고수준 암호화에 PyNaCl 사용

PyNaCl은 NaCl/libsodium 라이브러리를 감싼, 잘못 사용하기 어려운 사용 방침이 정해진 API입니다.

# pip install PyNaCl
import nacl.secret
import nacl.utils

key = nacl.utils.random(nacl.secret.SecretBox.KEY_SIZE)
box = nacl.secret.SecretBox(key)

encrypted = box.encrypt(b"my secret message")
decrypted = box.decrypt(encrypted)
print("Decrypted:", decrypted)  # Uses XSalsa20-Poly1305

안전한 패턴: Argon2를 사용한 비밀번호 해싱

비밀번호 해싱에는 argon2-cffi를 사용하십시오. SHA-256이나 bcrypt를 직접 사용해서는 안 됩니다.

# pip install argon2-cffi
from argon2 import PasswordHasher

ph = PasswordHasher(time_cost=3, memory_cost=65536, parallelism=4)
hash_val = ph.hash("user_password")
print("Hash:", hash_val[:40], "...")

# Verify
try:
    ph.verify(hash_val, "user_password")
    print("Password correct")
except Exception:
    print("Wrong password")

키 제로화

메모리에서 키를 사용한 후에는 메모리 덤프 공격에 노출되는 시간을 줄이기 위해 키를 0으로 지우십시오. Python의 GC 때문에 이 작업은 어렵습니다. 이를 자동으로 처리하는 ctypes 또는 PyNaCl을 사용하십시오.

이해도 확인

암호화 MAC을 비교할 때 == 대신 사용해야 하는 Python 함수는 무엇입니까?

학습 내용 복습

키 하드코딩, ECB 모드, MAC 비교에서의 ==, random 모듈 및 논스 재사용을 피하십시오. 난수 생성에는 os.urandom/secrets를, 암호화에는 AESGCM을, 검증에는 hmac.compare_digest를 사용하십시오. PyNaCl과 argon2-cffi는 대칭 암호화와 비밀번호에 안전한 고수준 API를 제공합니다.

자주 묻는 질문

“흔한 Python 암호화 실수와 안전한 패턴” 강의는 무료인가요?

네 — “흔한 Python 암호화 실수와 안전한 패턴” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“흔한 Python 암호화 실수와 안전한 패턴”에서 뭘 배우나요?

키 하드코딩, ECB 모드, 상수 시간이 아닌 비교 등의 문제를 피합니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“흔한 Python 암호화 실수와 안전한 패턴” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Python 암호화 라이브러리 개요
  2. Python에서 AES-GCM 암호화 및 복호화
  3. Python의 RSA 및 ECDSA 키 쌍
  4. 흔한 Python 암호화 실수와 안전한 패턴
← Cryptology Academy(으)로 돌아가기