I used the first 300 lines of the /usr/dict/words file in my
Solaris box and save them into the file mywords,
you can use any list of words you would like. Also, if you
desire to have a better random generator, use the Mersenne Twister functions
(see the manual entries for
mt_rand()
and
mt_srand()
for their description and links to more information).
Creating a function
Of course, we can make all of this into a function that you can drop in your
scripts:
List 2: function ppassgen()
<?php
/*
* Pronounceable password generator
* version 1.0 - made into a function
* 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
*/
/*
* function ppassgen()
* parameters:
* $words = the name of the file w/ the words (one per line)
* or and array of words
* $min = the minimum number of words per password
* $max = the maximum number of words per password
* $cutoff = the minimum number of characters per word
* $sep = separator for the words in the password
*/
function ppassgen($words= "mywords", $min=2, $max=4, $cutoff=5, $sep= "_") {
if(is_array($words)) {
/* if we have passed and array of words, use it */
$word_arr = "words";
/*
while(list($k,$v) = each(${$word_arr})) {
echo "$k $v<BR>";
}
*/
} else {
/* 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 */
$word_arr = "ext_arr";
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)) {
$ext_arr[] = strtolower($tword);
}
}
fclose($fp);
}
}
/* size of array of words */
$size_word_arr = count(${$word_arr});
/* generate the password */
srand((double)microtime()*1000000);
/* or use the Mersenne Twister functions */
//mt_srand((double)microtime()*1000000);
/* for a password of a fixed word number, min = max */
$n_words = ($min == $max)? $min : rand($min,$max);
/* or use the Mersenne Twister for a better random */
//$n_words = ($min == $max)? $min : mt_rand($min,$max);
for ($i=0; $i<$n_words; $i++) {
$pass .= ${$word_arr}[rand(0,($size_word_arr - 1))] . $sep;
}
/* return the password minus the last separator */
return substr($pass,0,-1*strlen($sep));
}
/* test the function */
/* generate 10 passwords using the default */
for ($j=0; $j < 10; $j++) {
echo ppassgen() . "<BR>\n";
}
/* change some paramaters and use our own separator */
echo "<HR>\n";
echo ppassgen( "mywords",3,4,7, "**") . "<BR>\n";
/* give our own array to the function and generate a 2 word password */
$nwords = array( "cat", "mouse", "dog", "house", "surfboard", "kirima");
echo ppassgen($nwords,2,2,3) . "<BR>\n";