Cryptology Academy · Lezione

Errori comuni nella crittografia Python e pattern sicuri

Eviti chiavi codificate direttamente nel codice, la modalità ECB, i confronti non constant-time e altri errori.

Lezione 4 di 413 passaggi

Errori comuni nella crittografia Python e pattern sicuri è una lezione Cryptology Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Cryptology Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Cryptology Academy include 4 lezioni in totale.

Gli errori crittografici più pericolosi

È facile utilizzare la crittografia in modo errato. Le insidie più comuni in Python sono: chiavi codificate nel codice, modalità ECB, confronti non eseguiti in tempo costante, casualità debole, riutilizzo di chiavi o nonce e implementazione autonoma della crittografia.

Insidia 1: chiavi codificate nel codice

Non inserisca mai le chiavi nel codice sorgente. Finirebbero nella cronologia di git, nei log e nei messaggi di errore. Utilizzi variabili d'ambiente o un 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

Insidia 2: modalità ECB

AES-ECB crittografa ogni blocco in modo indipendente: blocchi di testo in chiaro identici producono blocchi di testo cifrato identici. L'attacco del "pinguino ECB" rivela schemi nelle immagini e nei dati strutturati. Utilizzi sempre GCM o CBC con un IV casuale.

# 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

Insidia 3: confronto dei MAC non eseguito in tempo costante

L'utilizzo di == per confrontare i MAC divulga informazioni sui tempi di esecuzione. Utilizzi sempre 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

Insidia 4: generazione debole di numeri casuali

Non utilizzi mai il modulo random per scopi crittografici: non è un CSPRNG. Utilizzi secrets o 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

Insidia 5: riutilizzo di IV/nonce

Riutilizzare un IV con CBC o un nonce con GCM compromette la sicurezza. Generi un IV/nonce casuale nuovo per ogni crittografia e lo memorizzi insieme al testo cifrato:

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)

Insidia 6: utilizzo di MD5 o SHA-1 per la sicurezza

MD5 e SHA-1 sono compromessi dal punto di vista crittografico per quanto riguarda la resistenza alle collisioni. Non li utilizzi mai per firme digitali, impronte digitali di certificati o HMAC. Utilizzi SHA-256 o SHA-3-256.

Insidia 7: implementazione autonoma della crittografia

Implementare primitive crittografiche da zero introduce quasi sempre bug difficili da individuare. Utilizzi i pacchetti cryptography, PyNaCl o PyCA. Non implementi mai personalmente AES, RSA o ECDSA.

Schema sicuro: PyNaCl per la crittografia di alto livello

PyNaCl integra la libreria NaCl/libsodium e offre un'API basata su scelte predefinite, difficile da utilizzare in modo errato:

# 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

Schema sicuro: hashing delle password con Argon2

Utilizzi argon2-cffi per l'hashing delle password, mai SHA-256 o bcrypt direttamente:

# 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")

Azzeramento delle chiavi

Dopo aver utilizzato una chiave in memoria, la azzeri per ridurre la finestra di esposizione agli attacchi tramite dump della memoria. Il GC di Python rende questa operazione difficile: utilizzi ctypes o PyNaCl, che la gestisce automaticamente.

Verifica delle conoscenze

Quale funzione Python deve essere utilizzata al posto di == per confrontare i MAC crittografici?

Riepilogo della lezione

Eviti le chiavi codificate nel codice, la modalità ECB, == per confrontare i MAC, il modulo random e il riutilizzo dei nonce. Utilizzi os.urandom/secrets per la casualità, AESGCM per la crittografia e hmac.compare_digest per la verifica. PyNaCl e argon2-cffi forniscono API sicure di alto livello per la crittografia simmetrica e le password.

Gratis per iniziare

Impara Cryptology Academy con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
67
Lezioni
261

Domande Frequenti

La lezione «Errori comuni nella crittografia Python e pattern sicuri» è gratuita?

Sì — il testo completo di «Errori comuni nella crittografia Python e pattern sicuri» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Cryptology Academy, passa a CoddyKit PRO. Il corso Cryptology Academy include 4 lezioni in totale.

Cosa imparerò in «Errori comuni nella crittografia Python e pattern sicuri»?

Eviti chiavi codificate direttamente nel codice, la modalità ECB, i confronti non constant-time e altri errori. Eserciti Cryptology Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Cryptology Academy?

Non è richiesta alcuna esperienza precedente. Cryptology Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Errori comuni nella crittografia Python e pattern sicuri»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Cryptology Academy?

Sì. Ogni lezione Cryptology Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Panoramica della libreria Python cryptography
  2. Cifratura e decifratura AES-GCM in Python
  3. Coppie di chiavi RSA ed ECDSA in Python
  4. Errori comuni nella crittografia Python e pattern sicuri
← Torna a Cryptology Academy