Bezpieczne generowanie kluczy, nonce’ów i IV
Użyć secrets, os.urandom i bezpiecznych wrapperów w Pythonie i Node
Bezpieczne generowanie kluczy, nonce’ów i IV 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.
Trzy kategorie
Trzy różne wartości kryptograficzne wymagają bezpiecznego generowania: (1) Klucze — długotrwałe, muszą być nieprzewidywalne i tajne. (2) IV — używane dla każdej wiadomości, mogą być publiczne, ale muszą być nieprzewidywalne (CBC) lub unikatowe (GCM). (3) Nonce — muszą być unikatowe przy każdym użyciu, ale nie muszą być losowe.
Klucze symetryczne
AES-128: secrets.token_bytes(16). AES-256: secrets.token_bytes(32). ChaCha20: secrets.token_bytes(32). Nigdy nie należy wyprowadzać kluczy z haseł bez użycia KDF (PBKDF2/Argon2). Nie należy ponownie używać kluczy z różnymi algorytmami ani do różnych celów.
Generowanie kluczy asymetrycznych
from cryptography.hazmat.primitives.asymmetric import ec, rsa rsa_key = rsa.generate_private_key(public_exponent=65537, key_size=2048) ec_key = ec.generate_private_key(ec.SECP256R1()) # The library handles entropy sourcing internally
IV dla AES-CBC
AES-CBC wymaga równomiernie losowego 16-bajtowego IV dla każdej wiadomości. Nigdy nie należy ponownie używać IV z tym samym kluczem. Nie należy używać licznika jako IV w trybie CBC. Należy wygenerować: iv = os.urandom(16). IV należy dołączyć na początku tekstu zaszyfrowanego — nie musi być tajny, a jedynie nieprzewidywalny.
Nonce dla AES-GCM
AES-GCM wymaga unikatowego 96-bitowego nonce dla każdej pary (klucz, wiadomość). Ponowne użycie nonce katastrofalnie narusza bezpieczeństwo GCM: atakujący odzyskuje klucz uwierzytelniania i może fałszować wiadomości. Należy używać losowego nonce o długości 12 bajtów (granica urodzinowa przy 2^32 wiadomościach) albo licznika.
Nonce oparte na liczniku
W przypadku szyfrowania dużej liczby danych jednym kluczem należy utrzymywać trwały licznik dla każdego klucza. nonce = counter.to_bytes(12, "big"). Po każdym szyfrowaniu należy zwiększyć licznik. Licznik trzeba zapisywać w trwałej pamięci — zresetowanie go po ponownym uruchomieniu powoduje ponowne użycie nonce.
AEAD odporne na niewłaściwe użycie nonce
AES-GCM-SIV i Deoxys-II są odporne na niewłaściwe użycie nonce: ponowne użycie nonce obniża bezpieczeństwo do poziomu szyfrowania deterministycznego (nie dochodzi do wycieku klucza uwierzytelniania). Są zalecane, gdy trudno zagwarantować unikatowość nonce (systemy rozproszone, scenariusze awarii i ponownego uruchomienia).
HKDF do wyprowadzania kluczy
Nie należy bezpośrednio używać surowego materiału kluczowego do wielu celów. Należy wyprowadzać klucze przeznaczone do konkretnych celów: from cryptography.hazmat.primitives.kdf.hkdf import HKDF. hkdf = HKDF(SHA256(), 32, salt, info=b"enc_key"). key = hkdf.derive(master_key). Dla każdego celu należy używać innej wartości info.
Klucze sesyjne
Klucze przeznaczone dla konkretnej sesji należy wyprowadzać ze wspólnego sekretu (np. wyniku ECDH) za pomocą HKDF. TLS 1.3 wyprowadza oddzielne klucze klienta i serwera dla uzgadniania oraz danych aplikacji. Klucze sesyjne izolują skutki przejęcia: poznanie jednego klucza sesyjnego nie ujawnia niczego o pozostałych.
Owijanie kluczy
Aby bezpiecznie przechowywać klucz, należy opakować go za pomocą klucza szyfrowania kluczy (KEK), używając AES-KW (RFC 3394) lub AES-GCM. Opakowany klucz można przechowywać w bazie danych lub przesyłać. KEK jest przechowywany w HSM albo magazynie kluczy wspieranym sprzętowo (Android Keystore, Apple Secure Enclave).
Lista kontrolna audytu
Przed wdrożeniem należy sprawdzić: (1) wszystkie klucze pochodzą z os.urandom/secrets. (2) Brak kluczy/IV wpisanych na stałe w kodzie. (3) IV nigdy nie są ponownie używane z tym samym kluczem. (4) Nonce GCM są unikatowe dla każdej wiadomości. (5) Zdefiniowano harmonogram rotacji kluczy. (6) Wyprowadzanie kluczy używa HKDF z różnymi ciągami info.
Szybkie sprawdzenie
Jaki jest skutek ponownego użycia nonce w AES-GCM?
Podsumowanie
Klucze wymagają rzeczywiście losowego generowania, IV w CBC wymagają losowości, a nonce w GCM wymagają unikatowości. Należy używać os.urandom/secrets, wyprowadzać klucze za pomocą HKDF i opakowywać je przy użyciu KEK. AEAD odporne na niewłaściwe użycie nonce chronią przed przypadkowym ponownym użyciem. Dalej: dowody z wiedzą zerową.
Ucz się Cryptology Academy dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 67
- Lekcje
- 261
Często zadawane pytania
Czy lekcja „Bezpieczne generowanie kluczy, nonce’ów i IV” jest bezpłatna?
Tak — pełny tekst „Bezpieczne generowanie kluczy, nonce’ów i IV” 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 „Bezpieczne generowanie kluczy, nonce’ów i IV”?
Użyć secrets, os.urandom i bezpiecznych wrapperów w Pythonie i Node Ć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 „Bezpieczne generowanie kluczy, nonce’ów i IV”?
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
- Prawdziwa losowość a pseudolosowość
- Kryptograficznie bezpieczne PRNG
- Niedobór entropii i błędy związane ze słabymi kluczami
- Bezpieczne generowanie kluczy, nonce’ów i IV