Random password generator

From Wikipedia, the free encyclopedia

A random password generator is software program or hardware device that takes input from a random or pseudo-random number generator (See random number generator) and automatically generates a password. Random passwords can be generated manually, using simple sources of randomness such as dice or coins, or they can be generated using a computer.

While there are many examples of "random" password generator programs available on the Internet, generating randomness can be tricky and many programs do not generate random characters in a way that insures strong security. A common recommendation is to use open source security tools where possible, since they allow independent checks on the quality of the methods used. Note that simply generating a password at random does not ensure the password is a strong password, because it is possible, although highly unlikely, to generate an easily guessed or cracked password.

A password generator can be part of a password manager. When a password policy enforces complex rules, it can be easier to use a password generator based on that set of rules then to manually create passwords.

Contents

[edit] The naive approach

Here are two code samples that are typical of what many programmers believe is a suitable password generator:

[edit] C

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

int main(void) {
    int length = 8;
    int r,i;
    char c;
    srand((unsigned int)time(0)); //Seed number for rand()
    for(i=0; i<length; i++) {
        r = rand() + 33;
        c = (char)r;
        printf("%c", c);
    }
}

In this case, the standard C function rand, which is a pseudo-random number generator, is seeded using the C time function. According to the ANSI C standard, time returns a value of type time t, which is implementation defined, but most commonly a 32-bit integer containing the current number of seconds since January 1, 1970 (see: Unix time). There are about 31 million seconds in a year, so an attacker who knows the year in which the password was generated (a simple matter in situations where frequent password changes are mandated by password policy) faces a relatively small number, by cryptographic standards, of choices to test. In situations where the attacker can obtain an encrypted version of the password, such testing can be performed rapidly enough so that a few million trial passwords can be checked in a matter of seconds. See: password cracking.

The function rand presents another problem. All pseudo-random number generators have an internal memory or state. The size of that state determines the maximum number of different values it can produce: an n-bit state can produce at most 2n> different values. On many systems rand has a 31 or 32 bit state, which is already a significant security limitation. On Microsoft Windows, rand has only a 15-bit state, allowing just 32 767 possible outputs. [1]

[edit] PHP

function pass_gen($len) {
    $pass = '';
    srand((float) microtime() * 10000000);
    for($i=0; $i<$len; $i++) {
        $pass .= chr(rand(33, 126));
    }
    return $pass;
}

In the second case, the PHP function microtime is used, which returns the current Unix timestamp with microseconds.[2] This increases the number of possibilities, but someone with a good guess of when the password was generated, for example the date an employee started work, still has a reasonably small search space. Also some operating systems do not provide time to microsecond resolution, sharply reducing the number of choices. Finally the rand function [3] usually uses the underlying C rand function, and may have a small state space, depending on how it is implemented.

[edit] Stronger methods

Some computer operating systems provide much stronger random number generators. One example, common on most Unix platforms, is /dev/random. The Java programming language includes a class called SecureRandom. [4] Windows programmers can use the Cryptographic Application Programming Interface function CryptGenRandom. Another possibility, is to derive randomness by measuring some external phenomenon, such as timing user keyboard input. Using random bytes from any of these sources should prove adequate for most password generation needs.

Yet another method is to use physical devices such as dice to generate the randomness. One simple way to do this uses a 6 by 6 table of characters. The first die roll selects a row in the table and the second a column. So, for example, a roll of 2 followed by a roll of 4 would select the letter "j" from the table below.

1 2 3 4 5 6
1 a b c d e f
2 g h i j k l
3 m n o p q r
4 s t u v w x
5 y z 0 1 2 3
6 4 5 6 7 8 9

[edit] Type and strength of password generated

Random password generators normally output a string of symbols of specified length. These can be individual characters from some character set, syllables designed to form pronounceable passwords, or words from some word list to form a passphrase. The program can be customized to ensure the resulting password complies with the local password policy, say by always producing a mix of letters, numbers and special characters.

The strength of a random password can be calculated by computing the information entropy of the random process that produced it. If each symbol in the password is produced independently, the entropy is just given by the formula

H = L\log_2 N = L {\log N \over \log 2}

where N is the number of possible symbols and L is the number of symbols in the password. The function log2 is the base-2 logarithm. H is measured in bits.

Symbol set N Entropy/symbol
Digits only (0-9) (e.g. PIN) 10 3.32 bits
Single case letters (a-z) 26 4.7 bits
Single case letters and digits (a-z, 0-9) 36 5.17 bits
Mixed case letters and digits (a-z, A-Z, 0-9) 62 5.95 bits
All standard U.S. keyboard characters 94 6.55 bits
Diceware word list 7776 12.9 bits

Thus an eight character password of single case letters and digits would have 41 bits of entropy. The same length password selected at random from all U.S. computer keyboard characters would have 52 bit entropy; however such a password would be harder to memorize and might be difficult to enter on non-U.S. keyboards.

Any password generator is limited by the state space of the pseudo-random number generator, if one is used. Thus a password generated using the Windows rand function has a maximum entropy of 15 bits, regardless of the number of characters it contains.

[edit] See also

[edit] External links