#native_company# #native_desc#
#native_cta#

Generating Pronounceable Passwords

By Jess Castagnetto
on July 30, 2000

The problem
Just today (1999/04/29), someone asked in the
PHPBuilder discussion
boards
if there was a way to generate random but
pronounceable passwords. I guess something like the ubiquitous passwords
you find in each of the AOL CD-ROMs that litter our mailboxes ūüôā
In this article we will show how to do just that, with the constrains that we
do not want to have number containing words in your output, and that we want
to be able to specify the length of the words used.
The simplest way I could think to accomplish this would be to:
  1. Have a set of words (maybe in an array)
  2. Select the number of words to use in the password
  3. Pick the words and concatenate them
In the listing below, we will
read a list of words from a file into an array, and then use
the random functions in PHP to generate the password.
List 1: a simple pronounceable password generator

<?php

/* 

 * Pronounceable password generator

 * version 1.0beta

 * Inspired by a question made by: georgcantor_at_geocities.com

 * in the PHPBuilder discussion forum

 * (c) Jesus M. Castagnetto, 1999

 * GPL'd code, see www.fsf.org for more info

 */ 

$words =  "mywords";     /* the file w/ the words */ 

$cut_off = 5;     /* minimum number of letters in each word */ 

$min_pass = 2;     /* minimum number of words in password */ 

$max_pass = 3;     /* maximum number of words in password */ 

/* read the external file into an array */ 

$fp = fopen($words, "r");

if (!fp) {

    echo  
"[ERROR]: Could not open file $words<BR>n";

    exit;

} else {

    
/* assuming words of up to 127 characters */ 

    
while(!feof($fp)) {

        
$tword = trim(fgets($fp,128));

     

        
/* check for minimum length and for exclusion of numbers */ 

        
if ((strlen($tword) >= $cut_off) && !ereg( "[0-9]",$tword)) {

            
$word[] = strtolower($tword);

        }

    }

    
fclose($fp);

}

/* generate the password */ 

$size_word = count($word);

srand((double)microtime()*1000000);

$n_words = rand($min_pass,$max_pass);

/* use the Mersenne Twister for a better random */ 

#mt_srand((double)microtime()*1000000); 

#$n_words = mt_rand($min_pass,$max_pass); 

for ($i=0; $i < $n_words; $i++) {

    
$pass .= $word[rand(0,($size_word - 1))] .  "_";

}

/* print the password */ 

echo substr($pass,0,-1). "<BR>n";

?>



If you run the program listed above, the output would be (for example):

addressograph_accessible_adapt_acrid


ÔĽŅ