Cryptology Academy · Lektion

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.

Lektion 4 av 413 steg

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 startup

Fallgrop 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 encryption

Fallgrop 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):
    pass

Fallgrop 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 wrapper

Fallgrop 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-Poly1305

Sä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.

Gratis att börja

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

  1. Översikt över Python-biblioteket cryptography
  2. Kryptera och dekryptera med AES-GCM i Python
  3. RSA- och ECDSA-nyckelpar i Python
  4. Vanliga kryptografiska fallgropar i Python och säkra mönster
← Tillbaka till Cryptology Academy