Typowe pułapki kryptograficzne w Pythonie i bezpieczne wzorce
Unikać kluczy zapisanych na stałe, trybu ECB, porównań bez stałego czasu wykonania i innych błędów
Typowe pułapki kryptograficzne w Pythonie i bezpieczne wzorce to bezpłatna lekcja Cryptology Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cryptology Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cryptology Academy zawiera 4 lekcji w sumie.
Najgroźniejsze błędy w kryptografii
Kryptografię łatwo zastosować nieprawidłowo. Najczęstsze pułapki w Pythonie to klucze zapisane na stałe w kodzie, tryb ECB, porównania niewykonywane w stałym czasie, słaba losowość, ponowne używanie kluczy lub nonce oraz tworzenie własnych rozwiązań kryptograficznych.
Pułapka 1: klucze zapisane na stałe
Nigdy nie umieszczaj kluczy w kodzie źródłowym. Trafiają one do historii git, dzienników i komunikatów o błędach. Używaj zmiennych środowiskowych lub 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 startupPułapka 2: tryb ECB
AES-ECB szyfruje każdy blok niezależnie — identyczne bloki tekstu jawnego tworzą identyczne bloki szyfrogramu. Atak „pingwina ECB” ujawnia wzorce na obrazach i w danych o strukturze. Zawsze używaj GCM albo CBC z losowym IV.
# 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 encryptionPułapka 3: porównywanie MAC bez stałego czasu wykonania
Używanie == do porównywania MAC ujawnia informacje o czasie wykonania. Zawsze używaj 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):
passPułapka 4: słabe generowanie liczb losowych
Nigdy nie używaj modułu random do celów kryptograficznych — nie jest on CSPRNG. Używaj secrets lub 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 wrapperPułapka 5: ponowne używanie IV lub nonce
Ponowne użycie IV z CBC lub nonce z GCM łamie bezpieczeństwo. Przy każdym szyfrowaniu generuj nowy, losowy IV lub nonce i przechowuj go razem z szyfrogramem:
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)Pułapka 6: używanie MD5 lub SHA-1 do celów bezpieczeństwa
MD5 i SHA-1 są kryptograficznie złamane w zakresie odporności na kolizje. Nigdy nie używaj ich do podpisów cyfrowych, odcisków certyfikatów ani HMAC. Używaj SHA-256 lub SHA-3-256.
Pułapka 7: tworzenie własnej kryptografii
Implementowanie prymitywów kryptograficznych od podstaw niemal zawsze prowadzi do subtelnych błędów. Używaj pakietów cryptography, PyNaCl lub PyCA. Nigdy samodzielnie nie implementuj AES, RSA ani ECDSA.
Bezpieczny wzorzec: PyNaCl do kryptografii wysokopoziomowej
PyNaCl opakowuje bibliotekę NaCl/libsodium — udostępnia interfejs oparty na określonych założeniach, trudny do niewłaściwego użycia:
# 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-Poly1305Bezpieczny wzorzec: haszowanie haseł za pomocą Argon2
Do haszowania haseł używaj argon2-cffi — nigdy bezpośrednio SHA-256 ani 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")Zerowanie kluczy
Po użyciu klucza w pamięci wyzeruj go, aby skrócić okno czasowe dla ataków polegających na zrzucie pamięci. Mechanizm GC w Pythonie utrudnia to zadanie — użyj ctypes albo PyNaCl, który wykonuje tę operację automatycznie.
Sprawdzenie wiedzy
Jakiej funkcji Pythona należy użyć zamiast == podczas porównywania kryptograficznych MAC?
Podsumowanie lekcji
Unikaj kluczy zapisanych na stałe, trybu ECB, używania == do porównywania MAC, modułu random oraz ponownego używania nonce. Do losowości używaj os.urandom/secrets, do szyfrowania AESGCM, a do weryfikacji hmac.compare_digest. PyNaCl i argon2-cffi udostępniają bezpieczne interfejsy wysokopoziomowe do kryptografii symetrycznej i obsługi haseł.
Często zadawane pytania
Czy lekcja „Typowe pułapki kryptograficzne w Pythonie i bezpieczne wzorce” jest bezpłatna?
Tak — pełny tekst „Typowe pułapki kryptograficzne w Pythonie i bezpieczne wzorce” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cryptology Academy, przejdź na CoddyKit PRO. Kurs Cryptology Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Typowe pułapki kryptograficzne w Pythonie i bezpieczne wzorce”?
Unikać kluczy zapisanych na stałe, trybu ECB, porównań bez stałego czasu wykonania i innych błędów Ćwiczysz Cryptology Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Cryptology Academy?
Nie wymagamy żadnego doświadczenia. Cryptology Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Typowe pułapki kryptograficzne w Pythonie i bezpieczne wzorce”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Cryptology Academy?
Tak. Każda lekcja Cryptology Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Przegląd biblioteki cryptography dla języka Python
- Szyfrowanie i odszyfrowywanie AES-GCM w Pythonie
- Pary kluczy RSA i ECDSA w Pythonie
- Typowe pułapki kryptograficzne w Pythonie i bezpieczne wzorce