Pièges courants de la cryptographie Python et pratiques sécurisées
Évitez les clés codées en dur, le mode ECB, les comparaisons dont le temps n’est pas constant, et bien plus.
Pièges courants de la cryptographie Python et pratiques sécurisées est une leçon Cryptology Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Cryptology Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Cryptology Academy comprend 4 leçons au total.
Les erreurs cryptographiques les plus dangereuses
La cryptographie est facile à mal utiliser. Les pièges Python les plus courants sont les clés intégrées en dur, le mode ECB, les comparaisons dont la durée dépend des données, le faible niveau d'aléa, la réutilisation des clés ou des valeurs uniques et la création de sa propre cryptographie.
Piège 1 : clés intégrées en dur
N'intégrez jamais de clés dans le code source. Elles finissent dans l'historique git, les journaux et les messages d'erreur. Utilisez des variables d'environnement ou 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 startupPiège 2 : mode ECB
AES-ECB chiffre chaque bloc indépendamment : des blocs de texte en clair identiques produisent des blocs de texte chiffré identiques. L'attaque du « pingouin ECB » révèle des motifs dans les images et les données structurées. Utilisez toujours GCM ou CBC avec un vecteur d'initialisation aléatoire.
# 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 encryptionPiège 3 : comparaison de MAC dont la durée n'est pas constante
Utiliser == pour comparer des MAC divulgue des informations temporelles. Utilisez toujours 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):
passPiège 4 : génération faible de nombres aléatoires
N'utilisez jamais le module random à des fins cryptographiques : ce n'est pas un CSPRNG. Utilisez secrets ou 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 wrapperPiège 5 : réutilisation du vecteur d'initialisation ou de la valeur unique
Réutiliser un vecteur d'initialisation avec CBC ou une valeur unique avec GCM compromet la sécurité. Générez un nouveau vecteur d'initialisation ou une nouvelle valeur unique aléatoire pour chaque chiffrement et stockez-le avec le texte chiffré :
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)Piège 6 : utiliser MD5 ou SHA-1 pour la sécurité
MD5 et SHA-1 sont cryptographiquement compromis pour la résistance aux collisions. Ne les utilisez jamais pour les signatures numériques, les empreintes de certificats ou HMAC. Utilisez SHA-256 ou SHA-3-256.
Piège 7 : créer sa propre cryptographie
Implémenter des primitives cryptographiques à partir de zéro introduit presque toujours des erreurs subtiles. Utilisez les paquets cryptography, PyNaCl ou PyCA. N'implémentez jamais AES, RSA ou ECDSA vous-même.
Modèle sûr : PyNaCl pour une cryptographie de haut niveau
PyNaCl encapsule la bibliothèque NaCl/libsodium et fournit une API fondée sur des choix sécurisés, difficile à mal utiliser :
# 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-Poly1305Modèle sûr : hachage des mots de passe avec Argon2
Utilisez argon2-cffi pour le hachage des mots de passe, et jamais SHA-256 ou bcrypt directement :
# 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")Mise à zéro des clés
Après avoir utilisé une clé en mémoire, mettez-la à zéro afin de réduire la fenêtre d'exposition aux attaques par vidage de mémoire. Le ramasse-miettes de Python rend cette opération difficile ; utilisez ctypes ou PyNaCl, qui la gère automatiquement.
Vérification des connaissances
Quelle fonction Python faut-il utiliser à la place de == pour comparer des MAC cryptographiques ?
Récapitulatif de la leçon
Évitez les clés intégrées en dur, le mode ECB, == pour comparer les MAC, le module random et la réutilisation des valeurs uniques. Utilisez os.urandom/secrets pour l'aléa, AESGCM pour le chiffrement et hmac.compare_digest pour la vérification. PyNaCl et argon2-cffi fournissent des API de haut niveau sûres pour la cryptographie symétrique et les mots de passe.
Apprends Cryptology Academy avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 67
- Leçons
- 261
Questions Fréquemment Posées
La leçon « Pièges courants de la cryptographie Python et pratiques sécurisées » est-elle gratuite ?
Oui — le texte complet de « Pièges courants de la cryptographie Python et pratiques sécurisées » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Cryptology Academy, passe à CoddyKit PRO. Le cours Cryptology Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Pièges courants de la cryptographie Python et pratiques sécurisées » ?
Évitez les clés codées en dur, le mode ECB, les comparaisons dont le temps n’est pas constant, et bien plus. Tu pratiques Cryptology Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Cryptology Academy ?
Aucune expérience préalable n'est requise. Cryptology Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Pièges courants de la cryptographie Python et pratiques sécurisées » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Cryptology Academy ?
Oui. Chaque leçon Cryptology Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Présentation de la bibliothèque de cryptographie Python
- Chiffrer et déchiffrer avec AES-GCM en Python
- Paires de clés RSA et ECDSA en Python
- Pièges courants de la cryptographie Python et pratiques sécurisées