0Pricing
Cryptology Academy · Lekcja

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 startup

Puł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 encryption

Puł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):
    pass

Puł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 wrapper

Puł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-Poly1305

Bezpieczny 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

  1. Przegląd biblioteki cryptography dla języka Python
  2. Szyfrowanie i odszyfrowywanie AES-GCM w Pythonie
  3. Pary kluczy RSA i ECDSA w Pythonie
  4. Typowe pułapki kryptograficzne w Pythonie i bezpieczne wzorce
← Powrót do Cryptology Academy