Jak vytvořit generátor náhodných hesel v Pythonu

Bezpečnost hraje v našich životech klíčovou roli. S přesunem mnoha aktivit do online prostředí nabývá zabezpečení na významu. V této souvislosti se často hovoří o důležitosti silných hesel.

V tomto článku si ukážeme, jak si vytvořit vlastní generátor hesel, který vám umožní rychle a snadno vytvářet náhodná a robustní hesla.

Proč potřebujeme generátor hesel?

Není snadné vymýšlet různorodá a složitá hesla z hlavy. Naštěstí počítače to dokáží hravě. Vytvoří silná a náhodná hesla na základě vašich požadavků během několika sekund. Existuje mnoho dostupných generátorů, ale my si ukážeme, jak si vytvořit takový, který si můžete přizpůsobit svým potřebám.

Můžeme si tedy vytvořit generátor hesel přesně podle svých představ?

Odpověď zní: ano! V následujícím textu si ukážeme, jak na to.

Pustíme se do tvorby vlastního generátoru hesel.

Generátor hesel 💻

Největší výhodou vlastního generátoru je jeho flexibilita. Můžete si ho plně přizpůsobit.

Začneme generátorem, který se zeptá na požadovanou délku hesla a následně vygeneruje náhodné heslo obsahující číslice, písmena a speciální znaky.

Následně ho zdokonalíme a umožníme uživateli specifikovat počet jednotlivých typů znaků, tedy kolik číslic, písmen a speciálních znaků má heslo obsahovat.

Pojďme se tedy bez zbytečných průtahů podívat, jak vytvořit generátor hesel pomocí programovacího jazyka Python.

Postup

  • Nejprve si uložíme všechny znaky, ze kterých chceme generovat heslo, do seznamu. Můžeme využít modul string v Pythonu nebo znaky vypsat ručně.
  • Dále se uživatele zeptáme na požadovanou délku hesla.
  • Seznam znaků zamícháme pomocí funkce random.shuffle.
  • Vytvoříme prázdný seznam, do kterého budeme ukládat jednotlivé znaky hesla.
  • Vytvoříme smyčku, která se bude opakovat tolikrát, kolik znaků má mít heslo:
    • Náhodně vybereme znak ze seznamu všech znaků pomocí funkce random.choice.
    • Vybraný znak přidáme do seznamu s heslem.
  • Následně ještě jednou zamícháme seznam s heslem, aby byla jeho náhodnost co největší.
  • Převedeme seznam hesel na jeden řetězec pomocí funkce join.
  • Nakonec vygenerované heslo vypíšeme.

Zkuste si podle výše uvedeného postupu napsat vlastní kód. Nemějte obavy, pokud si nejste jisti, níže naleznete kompletní kód.

Kód

import string
import random

## znaky pro generování hesla
characters = list(string.ascii_letters + string.digits + "[email protected]#$%^&*()")

def generate_random_password():
    ## délka hesla od uživatele
    length = int(input("Zadejte délku hesla: "))

    ## zamíchání znaků
    random.shuffle(characters)
    
    ## výběr náhodných znaků ze seznamu
    password = []
    for i in range(length):
        password.append(random.choice(characters))

    ## zamíchání výsledného hesla
    random.shuffle(password)

    ## převedení seznamu na řetězec
    ## vypsání hesla
    print("".join(password))



## zavolání funkce
generate_random_password()

Výše uvedený kód je poměrně srozumitelný. Jednoduše jsme převedli kroky z popisu do kódu. Pokud si tedy pozorně přečtete postup, nebude pro vás pochopení kódu žádný problém.

Nyní si kód spusťte a vygenerujte heslo. Příklad výstupu by mohl vypadat takto:

Zadejte délku hesla: 10
d&amIzK%d)

Všimněte si vygenerovaného hesla. Obsahuje nějakou číslici? Ne. To proto, že náš program negarantuje, že heslo bude obsahovat všechny typy znaků.

Nyní se pokusíme zajistit, aby program generoval hesla obsahující i číslice a speciální znaky. Způsobíme to tak, že se uživatele zeptáme na požadovaný počet jednotlivých typů znaků.

Pokud uživatel zadá počet znaků pro každý typ, program zajistí, že heslo bude obsahovat alespoň tento počet daného typu.

Podívejme se tedy na kód, který přijímá počet znaků pro každý typ a generuje heslo.

import string
import random

## znaky pro generování hesla
alphabets = list(string.ascii_letters)
digits = list(string.digits)
special_characters = list("[email protected]#$%^&*()")
characters = list(string.ascii_letters + string.digits + "[email protected]#$%^&*()")

def generate_random_password():
    ## délka hesla od uživatele
    length = int(input("Zadejte délku hesla: "))

    ## počet znaků jednotlivých typů
    alphabets_count = int(input("Zadejte počet písmen v hesle: "))
    digits_count = int(input("Zadejte počet číslic v hesle: "))
    special_characters_count = int(input("Zadejte počet speciálních znaků v hesle: "))

    characters_count = alphabets_count + digits_count + special_characters_count

    ## kontrola celkového počtu znaků s délkou hesla
    ## vypsání hlášky, pokud je součet větší než délka
    if characters_count > length:
        print("Celkový počet znaků je větší než délka hesla")
        return

    ## inicializace hesla
    password = []
    
    ## výběr náhodných písmen
    for i in range(alphabets_count):
        password.append(random.choice(alphabets))

    ## výběr náhodných číslic
    for i in range(digits_count):
        password.append(random.choice(digits))

    ## výběr náhodných speciálních znaků
    for i in range(special_characters_count):
        password.append(random.choice(special_characters))

    ## pokud je celkový počet znaků menší než délka hesla
    ## přidáme náhodné znaky, aby se rovnal délce
    if characters_count < length:
        random.shuffle(characters)
        for i in range(length - characters_count):
            password.append(random.choice(characters))

    ## zamíchání výsledného hesla
    random.shuffle(password)

    ## převedení seznamu na řetězec
    ## vypsání hesla
    print("".join(password))



## zavolání funkce
generate_random_password()

Jaký je tedy rozdíl mezi předchozím kódem a tímto?

  • Pro každý typ znaku jsme vytvořili samostatné smyčky, abychom je přidali k heslu.
  • Přidali jsme dvě podmíněné kontroly pro ověření celkového počtu znaků s délkou hesla.

Přidali jsme pár řádků kódu navíc, ale princip zůstává podobný jako u předchozího kódu. Neměli byste tedy mít problém s jeho pochopením.

Nyní je čas kód spustit a zkontrolovat výstup. Podívejte se na následující ukázkový běh.

Zadejte délku hesla: 10
Zadejte počet písmen v hesle: 3
Zadejte počet číslic v hesle: 2
Zadejte počet speciálních znaků v hesle: 3
V2(&#XlQq1

Pokud se podíváte na vygenerované heslo, vidíte, že obsahuje minimální počet znaků od každého typu, který uživatel požadoval. A navíc obsahuje dva další náhodné znaky, aby se délka hesla rovnala požadované délce.

Výborně! Máme funkční generátor silných hesel. 😎

Závěr

Ukázali jsme si, jak od začátku vytvořit generátor hesel. Můžeme do něj přidat další funkce? Samozřejmě, můžeme přidat libovolné množství funkcí. Jen je důležité dbát na to, aby výsledné heslo bylo dostatečně silné.

Vygenerujte si hesla pomocí našeho kódu a používejte je pro své online účty.

A pokud potřebujete rychle vygenerovat heslo, využijte generátor náhodných hesel na etechblog.cz.

Přečtěte si také, jak vytvořit hru piškvorky v Pythonu.

Příjemné kódování! 👩‍💻