Vanliga kryptografiska fallgropar i Python och säkra mönster
Undvik hårdkodade nycklar, ECB-läge, jämförelser som inte körs i konstant tid och annat.
Vanliga kryptografiska fallgropar i Python och säkra mönster är en gratis lektion i Cryptology Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Cryptology Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Cryptology Academy innehåller totalt 4 lektioner.
De farligaste misstagen inom kryptografi
Kryptografi är lätt att använda fel. De vanligaste fallgroparna i Python är hårdkodade nycklar, ECB-läge, jämförelser som inte tar konstant tid, svag slumpgenerering, återanvändning av nycklar eller nonce-värden och att skriva egen kryptografi.
Fallgrop 1: Hårdkodade nycklar
Bädda aldrig in nycklar i källkoden. De hamnar till slut i git-historiken, loggar och felmeddelanden. Använd miljövariabler eller en 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 startupFallgrop 2: ECB-läge
AES-ECB krypterar varje block separat – identiska klartextblock ger identiska chiffertextblock. Angreppet "ECB-pingvinen" avslöjar mönster i bilder och strukturerade data. Använd alltid GCM eller CBC med ett slumpmässigt 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 encryptionFallgrop 3: MAC-jämförelser som inte tar konstant tid
Att använda == för att jämföra MAC-värden läcker tidsinformation. Använd alltid 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):
passFallgrop 4: Svag generering av slumptal
Använd aldrig modulen random för kryptografiska ändamål – den är inte en CSPRNG. Använd secrets eller 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 wrapperFallgrop 5: Återanvändning av IV eller nonce
Återanvändning av ett IV med CBC eller en nonce med GCM förstör säkerheten. Generera ett nytt slumpmässigt IV eller nonce för varje kryptering och lagra det tillsammans med chiffertexten:
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)Fallgrop 6: Användning av MD5 eller SHA-1 för säkerhet
MD5 och SHA-1 är kryptografiskt trasiga när det gäller kollisionsresistens. Använd dem aldrig för digitala signaturer, certifikatfingeravtryck eller HMAC. Använd SHA-256 eller SHA-3-256.
Fallgrop 7: Skriv inte egen kryptografi
Att implementera kryptografiska primitiver från grunden leder nästan alltid till svårupptäckta buggar. Använd paketen cryptography, PyNaCl eller PyCA. Implementera aldrig AES, RSA eller ECDSA själv.
Säkert mönster: PyNaCl för kryptografi på hög nivå
PyNaCl kapslar in biblioteket NaCl/libsodium – ett API med tydliga säkerhetsval som är svårt att använda fel:
# 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-Poly1305Säkert mönster: Lösenordshashning med Argon2
Använd argon2-cffi för lösenordshashning – aldrig SHA-256 eller bcrypt direkt:
# 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")Nollställning av nycklar
Nollställ en nyckel efter att du har använt den i minnet för att minska tidsfönstret för minnesdumpattacker. Pythons GC gör detta svårt – använd ctypes eller PyNaCl, som hanterar detta automatiskt.
Kunskapskontroll
Vilken Python-funktion måste användas i stället för == vid jämförelse av kryptografiska MAC-värden?
Lektionssammanfattning
Undvik hårdkodade nycklar, ECB-läge, == för MAC-jämförelser, modulen random och återanvändning av nonce-värden. Använd os.urandom/secrets för slumpgenerering, AESGCM för kryptering och hmac.compare_digest för verifiering. PyNaCl och argon2-cffi tillhandahåller säkra högnivå-API:er för symmetrisk kryptografi och lösenord.
Lär dig Cryptology Academy med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 67
- Lektioner
- 261
Vanliga frågor
Är lektionen ”Vanliga kryptografiska fallgropar i Python och säkra mönster” gratis?
Ja – hela texten till ”Vanliga kryptografiska fallgropar i Python och säkra mönster” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Cryptology Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Cryptology Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Vanliga kryptografiska fallgropar i Python och säkra mönster”?
Undvik hårdkodade nycklar, ECB-läge, jämförelser som inte körs i konstant tid och annat. Ni övar på Cryptology Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Cryptology Academy?
Du behöver inga förkunskaper. Utbildningen i Cryptology Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Vanliga kryptografiska fallgropar i Python och säkra mönster”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Cryptology Academy-lektionen?
Ja. Varje Cryptology Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Översikt över Python-biblioteket cryptography
- Kryptera och dekryptera med AES-GCM i Python
- RSA- och ECDSA-nyckelpar i Python
- Vanliga kryptografiska fallgropar i Python och säkra mönster