Today I had to create a script to create a large amount of unique passwords for a project. To be more specific, we needed more than 200000 passwords. So, I created a nice php script that does the job. These passwords were created in about 33mins on my desktop computer. Do you think it is slow? It would be great if you could provide any faster solution?
The script has two stages of duplication check, with the second one being optional. The first one is performed as soon as a new password is created. The second check happens at the end of the password generation, using the array_unique function of php.
The script outputs the password list as a .csv file and inside the browser. You can select which one you want to use from the parameters array.
You can configure the script at the start of it. I use a preferences array where you can set the way you want the script to run. Follows an explanation of the preferneces and how to use them.
<?php
/*************************************************************
** PHP Password generator 1.0
** Created by George Sokianos (2012/03/28)
**
**/
error_reporting(E_ALL);
ini_set('display_errors','On');
ini_set('max_execution_time', 3000);
$parameters = array(
'numofchars' => 8,
'numofcodes' => 3000000,
'upper' => true,
'lower' => false,
'nums' => true,
'duplicatecheck' => false,
'showtime' => true,
'exporttofile' => true,
'printcodes' => false
);
function getmicrotime()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function RandomPass( $params )
{
$NameChars = '';
if($params['lower']) {
$NameChars .= 'abcdefghijklmnopqrstuvwxyz';
}
if($params['upper']) {
$NameChars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
}
if($params['nums']) {
$NameChars .= '123456789';
}
$Pass = "";
$chars_count = strlen($NameChars);
for ($index = 1; $index <= $params['numofchars']; $index++) {
$Pass .= substr($NameChars, mt_rand(0, $chars_count-1), 1);
}
return $Pass;
}
// --------------------------------------------------------------------------------------
if($parameters['showtime']) {
$time_start = getmicrotime();
}
$passes = array();
for($i=0; $i<$parameters['numofcodes']; $i++) {
do {
$a = RandomPass($parameters);
} while(in_array($a, $passes));
array_push($passes, $a);
}
if($parameters['printcodes']) {
foreach($passes AS $curpass) {
echo $curpass;
echo '<br/>';
}
}
if($parameters['exporttofile']) {
$filename = 'files/passes_' . date('YmdHis') . '.csv';
$fh = fopen($filename, "w");
if($fh==false)
die("unable to create file");
foreach($passes AS $curpass) {
fputcsv($fh, array($curpass));
}
fclose ($fh);
}
echo '<br /><br />';
if($parameters['duplicatecheck']) {
if(count($passes) == count(array_unique($passes))) {
echo 'No duplicates detected';
} else {
echo 'DUPLICATES FOUND';
}
}
if($parameters['showtime']) {
$time_end = getmicrotime();
$time_passed = $time_end - $time_start;
echo "<hr />Execution time: " . $time_passed;
}
flush();
?>
Do not forget to include the code into php tags in your php file.