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).
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:
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";
?>