6. labor: Hash függvények és hitelesített titkosítás
|
1. A PasswdSHA256.txt állományban személyek nevei és jelszavaiknak hash értéke található. A hash értékek az SHA3-256-os hash függvényt alkalmazva voltak létrehozva. Határozzuk meg melyek azok a személyek, amelyeknek ugyanaz a jelszava. 2. A PasswdSHA256.json állományban személyek nevei és jelszavaiknak hash értéke található. A hash értékek az SHA3-256-os hash függvényt alkalmazva voltak létrehozva. Tudva, hogy néhány személy jelszava a leggyakrabban használt jelszavak közül került ki, határozzuk meg ezeket a személyeket, illetve a jelszavaikat. A leggyakrabban használt jelszavakat a 10-million-password-list-top-10000.txt állományban találjuk. 3. A PasswdSHA256Salt.json állományban személyek nevei, jelszavaiknak hash értéke és a megfelelő salt értékek találhatók. A hash értékek a Python hashlib.pbkdf2_hmac kulcs deriváló függvényével voltak létrehozva, ahol az alkalmazott hash függvény az SHA3-256-os volt és az iterációszám csak 1000-re volt állítva. Tudva, hogy néhány személyeknek jelszava a leggyakrabban használt jelszavak közül került ki, határozzuk meg ezeket a személyeket, illetve a jelszavaikat. A leggyakrabban használt jelszavakat a 10-million-password-list-top-10000.txt állományban találjuk. 4. Az előző feladatnál, akiknek sikerült a jelszavát feltörni, azok esetében végezzük el a következőket: mentsük ki egy json állományba a személyek nevét, a jelszavak hashértékét, és a salt-ot, de most az iterációszámot állítsuk legalább 1000000-re. Sikerül-e ebben az esetben is feltörni a jelszavakat? 5. Az előző feladatnál, akiknek sikerült a jelszavát feltörni, azok esetében végezzük el a következőket: mentsük ki egy json állományba a személyek nevét, a jelszavak hashértékét, és a salt-ot, de most a jelszavak hash értékét az scrypt-el vagy bcrypt-el hozzuk létre (scrypt/bcrypt). Sikerül-e ebben az esetben is feltörni a jelszavakat? 6. Titkosítsunk és fejtsünk vissza egy bináris állományt, AES-GCM titkosítást alkalmazva, ahol a nonce és kulcs értékeket generáljuk véletlenszerűen. A titkosítás során az állomány elejére írjuk be a nonce értékét, majd a végére a hitelesítő tag-et. Visszafejtéskor elenőrzizzük le azt is, hogy nem-e módosult az állomány tartalma. A generált kulcsot írjuk ki egy szövegállományba base64-es alakba. Hogyan járunk el ha az állományt csak részenként tudjk beolvasni, ha a teljes tartalom nem fér el a memóriában? 7. Titkosítsunk és fejtsünk vissza egy bináris állományt, ChaCha20-Poly130 titkosítást alkalmazva, ahol a nonce és kulcs értékeket generáljuk véletlenszerűen. A titkosítás során az állomány elejére írjuk be a nonce értékét, majd a végére a hitelesítő tag-et. Visszafejtéskor elenőrzizzük le azt is, hogy nem-e módosult az állomány tartalma. A generált kulcsot írjuk ki egy szövegállományba base64-es alakba. Az előző feladathoz képest jobb-e a futási idő? Hogyan járunk el ha az állományt csak részenként tudjk beolvasni, ha a teljes tartalom nem fér el a memóriában? Segédanyag JSON állományok írása, olvasása:
import json from base64 import b64encode, b64decode def writeJson(): nameL = ['Borika', 'Marika', 'Zsuzsa', 'Palko']
def readJson():emailL = ['borika@gmail.com', 'marika@gmail.com', 'zsuzsa@gmail.com', 'palko@gmail.com'] key = ['name', 'email'] personsL = [] for name, email in zip(nameL, emailL): value = [name, b64encode(email.encode()).decode()] person = dict(zip(key, value)) personsL.append(person) with open('myJson.json', 'wt') as f: json.dump(personsL, f, indent=4) with open('myJson.json', 'rt') as f:
personsL = json.load(f) for person in personsL: name = person['name'] email = b64decode(person['email'].encode()).decode() print(name, email) |
|