Generátor náhodných hesel

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

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

C

#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

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

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

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

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

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

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

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

Média použitá na této stránce

Two red dice 01.svg
Autor: Stephen Silver, Licence: CC0
two red dice