Előző - #18 Vásároljon 8-at, kap 1-et ingyen | Tartalomjegyzék | Következő - #20 szökőév
generPassword(12) → 'v*f6uoklQJ!d'
generPassword(12) → ' Yzkr(j2T$MsG'
generatePassword(16) → ' UVp7ow8T%5LZl1la'
Míg az egyetlen angol szóból (például „rózsabimbó” vagy „kardhal”) készült jelszót könnyű megjegyezni, nem biztonságos. A szótári támadás az, amikor a hackerek úgy programozzák számítógépeiket, hogy ismételten megpróbáljanak bejelentkezni a szótárban szereplő összes szó jelszóval. A szótári támadás nem működik, ha véletlenszerűen generált jelszavakat használ. Lehet, hogy nem könnyű megjegyezni őket, de megnehezítik a fiókok feltörését.
Gyakorlat leírása
Írj egy generatePassword()függvényt, amelynek van lengthparamétere. A hossz paraméter egy egész szám, amely megadja, hogy a generált jelszó hány karakterből álljon. Biztonsági okokból, ha length kisebb, mint 12, akkor a függvény mindenképpen 12 karakterre állítja be. A függvény által visszaadott jelszó karakterláncnak tartalmaznia kell legalább egy kisbetűt, egy nagybetűt, egy számot és egy speciális karaktert. A gyakorlat speciális karakterei: ~!@#$%^&*()_+.
A megoldásnak importálnia kell a Python random modult, hogy segítsen véletlenszerűen generálni ezeket a jelszavakat.
Ezek a Python- assertutasítások leállítják a programot, ha feltételük False. Másolja őket a megoldási program aljára. Az Ön megoldása akkor helyes, ha a következő assertállítások feltételei mind igazak :
assert len(generatePassword(8)) == 12
pw = generál jelszó (14)
állítsa len(pw) == 14
hasLowercase = False
hasUppercase = False
hasNumber = False
hasSpecial = False
a pw karakteréhez:
ha karakter a LOWER_LETTERS-ben:
hasLowercase = igaz
ha karakter UPPER_LETTERS-ben:
hasUppercase = igaz
ha karakter a NUMBERS-ban:
hasNumber = igaz
ha karakter a SPECIAL-ban:
hasSpecial = Igaz
assert hasKisbetű és hasNagybetű és hasNumber és hasSpecial
Próbáljon megoldást írni a leírásban szereplő információk alapján. Ha továbbra is problémái vannak ennek a gyakorlatnak a megoldásával, további tippekért olvassa el a Megoldástervezés és a Különleges esetek és Gotchák című részt.
Előfeltétel fogalmak: import utasítások, randommodul, karakterláncok, karakterlánc-összefűzés, len(), append(), randint() , shuffle(), join()
Megoldás tervezése
Először is létre kell hoznia állandó karakterláncokat a gyakorlathoz szükséges karakterkategóriák mindegyikéhez:
Ezután hozzon létre egy karakterláncot, amely mind a négy karakterláncot összefűzi egy 75 karakteres karakterláncba. Ezek a változók állandók , mivel nem arra való, hogy tartalmukat megváltoztassák. Megállapodás szerint a konstans változók ALL_NAGYBETŐSÉGES névvel vannak begépelve, és aláhúzásjelekkel kell elválasztani a szavakat megállapodás szerint. A konstansokat gyakran a globális hatókörben hozzák létre az összes függvényen kívül, nem pedig lokális változóként egy adott függvényen belül. A konstansokat általában minden programozási nyelvben használják, annak ellenére, hogy a „konstans változó” kifejezés kissé oximoron.
A generatePassword() függvény első sorában ellenőriznie kell, hogy az lengthargumentum kisebb-e, mint 12, és ha igen, akkor állítsa length értékre 12. Ezután hozzon létre egy password változót, amely üres listaként kezdődik. Ezután véletlenszerűen válasszon ki egy karaktert a kisbetűs konstansból a Python- random.randint() függvény segítségével, és válasszon egy véletlenszerű egész indexet az állandó karakterláncából. Tegye ezt a másik három állandóra is.
Annak biztosítására, hogy a végső jelszó mind a négy kategóriából tartalmazzon legalább egy karaktert, a jelszót minden kategóriából egy karakterrel kezdjük. Ezután addig adunk hozzá karaktereket a kombinált karakterláncból, amíg a jelszó el nem éri a kívánt hosszúságot.
De ez nem teljesen véletlen, mivel az első négy karakter kiszámítható kategóriákból származik. A probléma megoldásához a Python random.shuffle() függvényét hívjuk meg, hogy összekeverjük a karakterek sorrendjét. Sajnos a random.shuffle() funkció csak listákon működik, karakterláncokon nem, ezért a jelszót üres listából építjük fel, nem pedig üres karakterláncból.
Egy ciklusban folyamatosan adjon hozzá egy véletlenszerűen kiválasztott karaktert az összes karakterrel összefűzött karakterláncból, amíg a password lista nem lesz azonos hosszúságú a karakterlánccal length. Ezután adja át a jelszavak listáját a következőnek, hogy random.shuffle()összekeverje a karakterek sorrendjét. Végül egyesítse ezt a karakterlánc-listát egyetlen karakterláncban a használatával, ''.join(password)és adja vissza.
Különleges esetek és Gotchák
A random.shuffle()függvény csak listaértékekkel működik, karakterlánc-értékekkel nem. Ezért adunk hozzá egykarakteres karakterláncokat egy listához, keverjük össze, és a karakterláncok listáját egyetlen karakterláncba egyesítjük a join()string metódussal. Ellenkező esetben egy karakterlánc átadása a random.shuffle() következőhöz : TypeError: 'str' objektum nem támogatja az elem-hozzárendelési hibaüzenetet.
Most próbáljon meg egy megoldást írni az előző szakaszok információi alapján. Ha továbbra is problémái vannak a gyakorlat megoldásával, olvassa el a Megoldássablon részt további tippekért.
Megoldás sablon
Try to first write a solution from scratch. But if you have difficulty, you can use the following partial program as a starting place. Copy the following code from https://invpy.com/passwordgenerator-template.py and paste it into your code editor. Replace the underscores with code to make a working program:
# Import the random module for its randint() function.
import ____
# Create string constants that for each type of character:
LOWER_LETTERS = 'abcdefghijklmnopqrstuvwxyz'
UPPER_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
NUMBERS = '1234567890'
SPECIAL = '~!@#$%^&*()_+'
# Create a string that has all of these strings combined:
ALL_CHARS = LOWER_LETTERS + ____ + ____ + ____
def generatePassword(length):
# 12 is the minimum length for passwords:
if length ____ 12:
length = ____
# Create a password variable that starts as an empty list:
password = []
# Add a random character from the lowercase, uppercase, digits, and
# punctuation character strings:
password.append(LOWER_LETTERS[random.randint(0, 25)])
password.____(UPPER_LETTERS[random.randint(0, ____)])
password.____(NUMBERS[random.randint(0, ____)])
password.____(SPECIAL[random.randint(0, ____)])
# Keep adding random characters from the combined string until the
# password meets the length:
while len(password) < ____:
password.append(ALL_CHARS[random.randint(____, 74)])
# Randomly shuffle the password list:
random.shuffle(____)
# Join all the strings in the password list into one string to return:
return ''.join(____)
The complete solution for this exercise is given in Appendix A and https://invpy.com/passwordgenerator.py. You can view each step of this program as it runs under a debugger at https://invpy.com/passwordgenerator-debug/.
Further Reading
Most random number generator (RNG) algorithms are pseudorandom: they appear random but are actually predictable. Pseudorandom algorithms have an initial value (often an integer) called a seed, and the same starting seed value produces the same random numbers. For example, you can reset Python’s seed by passing a seed integer to random.seed(). Notice how setting the same seed in the following interactive shell example produces the same sequence of “random” numbers:
>>> import random
>>> random.seed(42) # Use any arbitrary integer for the seed.
>>> for i in range(20):
... print(random.randint(0, 9), end=' ')
...
1 0 4 3 3 2 1 8 1 9 6 0 0 1 3 3 8 9 0 8
>>> random.seed(42) # Reset using the same integer seed.
>>> for i in range(20):
... print(random.randint(0, 9), end=' ')
...
1 0 4 3 3 2 1 8 1 9 6 0 0 1 3 3 8 9 0 8
Python can also generate truly random, not pseudorandom, numbers based on several sources of systems entropy such as boot time, process IDs, position of the mouse cursor, millisecond timing in between the last several keystrokes, and others. You can look up the official Python documentation for the random.SystemRandom() function at https://docs.python.org/3/library/random.html.
These theoretical hacks on pseudorandom numbers might concern you if you’re an international spy or a journalist targeted by the intelligence agencies of nation-states, but in general, using this program is fine. Randomly- and pseudorandomly-generated passwords are still better than using a predictable password like “Stanley123”. And many hacks happen because people have keystroke-reading malware on their computers or reuse the same password for multiple accounts. So if the password database of a website you use is hacked, those hackers can then try to identify the users’ accounts on other popular websites and try those same passwords.
A password manager app is the most effective single thing a computer user can have to increase their security. When you need to log into a website, you enter your master password into the password manager app to unlock its encrypted database. Then you can copy the password from the manager to the clipboard. For example, your password could be something like GKfazu8WposcVP!EL8, but logging in with it is just a matter of pressing Ctrl-V to paste it into the website’s login page.
I recommend the free and open-source KeePass app from https://keepass.info, but many password manager apps are freely available.
Prev - #18 Buy 8 Get 1 Free | Table of Contents | Next - #20 Leap Year