Generátor náhodných hesel

Z Wikipedie, otevřené encyklopedie
Hrací kostky jako jednoduchý hardwarový generátor náhodných čísel (používá např. metoda diceware).

Generátor náhodných hesel je počítačový program, nebo hardwarové zařízení, které má vstup z náhodných nebo pseudo-náhodných čísel, ze kterých generátor vytvoří heslo. Náhodná hesla mohou být generována manuálně, pomocí jednoduchých zdrojů náhodnosti (mince, kostky), nebo mohou být generována pomocí počítače. Přikladem reálného využití hracích kostek jako hardwarového generátoru je diceware, což je metoda pro vytváření kvalitních heslových frází (varianta hesel).

Na internetu je spousta míst, kde lze získat „náhodné“ heslo, ale protože je generování náhodnosti složité, tak tyto programy nemusí produkovat skutečně náhodný výstup. Navíc není důležité generovat perfektně náhodná hesla, nýbrž hesla která lze jen těžko uhodnout (mnoho hesel z generátoru náhodných písmen bude snadno uhodnutelných). V kryptografii je nutné používat pečlivě navržené algoritmy, tzv. CSPRNGS: cryptographically secure pseudorandom number generators (kryptograficky bezpečné (pseudo)náhodné generátory čísel).

Nativní přístup[editovat | editovat zdroj]

Zde jsou dvě ukázky za využití standardních programových knihoven:

C[editovat | editovat zdroj]

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
    /* Length of the password */
    unsigned short int length = 8;

    /* Seed number for rand() */
    srand((unsigned int) time(0) + getpid());

    /* ASCII characters 33 to 126 */
    while(length--) {
        putchar(rand() % 94 + 33);
        srand(rand());
    }

    printf("\n");

    return EXIT_SUCCESS;
}

V tomto případě je využita standardní C funkce rand, což je generátor pseudo-náhodných čísel.

PHP[editovat | editovat zdroj]

function pass_gen($length = 8) {
    $pass = array();
    for ($i = 0; $i < $length; $i++) {
        $pass[] = chr(mt_rand(32, 126));
    }
    return implode($pass);
}

Silnější metody[editovat | editovat zdroj]

Existují různé metody pro generování silných šifrovaných bezpečnostních náhodnější hesel. Na Unix platformách /dev/random a /dev/urandom jsou běžně používané a to buď programově nebo s nějakým spojením s programem jako je makepasswd. Programátoři ve WINDOWS mohou použít z knihovny Microsoft CryptoAPI funkci CryptGenRandom. Programovací jazyk Java obsahuje třídu s názvem SecureRandom. Další možností je odvodit náhodnost měřením nějakého vnějšího jevu jako je načasování vstupu uživatelské klávesnice. Mnoho počítačových systémů již má vytvořenou aplikaci (standardní název APG) k provádění FIPS 181. FIPS 181 – automatický generátor hesel. Popisuje změnu náhodných bitů do nějakým způsobem vyslovitelných „slov“ vhodná pro hesla.

Bash[editovat | editovat zdroj]

Zde je ukázkový kód, který používá /dev/urandom generování hesla s jednoduchou Bash funkcí. Funkce má délku hesla jako parametr nebo využije délku 16 znaků jako výchozí.

function mkpw() { tr -dc '[:graph:]' < /dev/urandom | head -c ${1:-16}; echo; }

Není vhodné pro dlouhé kryptografé klíče, nebo tam kde je vyžadována vysoká úroveň bezpečnosti.

Java[editovat | editovat zdroj]

Zde je ukázkový kód který využívá SecureRandom a generuje 10místné hexadecimální číslo.

String[] symbols = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
int length = 10;
Random random = SecureRandom.getInstanceStrong(); // as of JDK 8, this should return the strongest algorithm available to the JVM
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
    int indexRandom = random.nextInt( symbols.length );
    sb.append( symbols[indexRandom] );
}
String password = sb.toString();

Python[editovat | editovat zdroj]

Jazyk Python obsahuje třídu SystemRandom, která získává náhodné bity na Unixových systémech z /dev/urandom (Linux a Mac OS X) a v systému Windows je použit CryptGenRandom.[1][2] Následující jednoduchý příklad ukazuje použití této třídy:

#!/usr/bin/python2
import random, string
myrg = random.SystemRandom()
length = 10
# Chcete-li non-anglicke znaky, vyjmete [0:52]
alphabet = string.letters[0:52] + string.digits
pw = str().join(myrg.choice(alphabet) for _ in range(length))
print pw

Perl[editovat | editovat zdroj]

Tento příklad využívá Crypt::Random::Source modul k nalezení silných náhodných čísel.

use Crypt::Random::Source qw(get_strong);

while(length($out) < 15) {
   my $a = get_strong(1);
   $a =~ s/[^[:graph:]]//g;
   $out .= $a;
}
print "$out\n";

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Random password generator na anglické Wikipedii.