In all my authentication systems, I've implemented the functionality to generate a temporary password. This comes in handy when a user forgets their password and they need to be emailed a new one.
When I generate a password, I avoid common the similar characters (such as o and 0, 1 and l etc etc.)
So, here's the class I created to manage my Random Password generation in PHP.
PHP Code:
<?php
class App_Data_Password {
/**
* Retrieve the next character while ensuring no duplication of characters
* next to each other
* @param string $haystack
* @param string $previousCharacter
* @return string
*/
private function randomNotSame($haystack, $previousCharacter) {
$maxKey = (count($haystack) - 1);
$key = rand(0, $maxKey);
$nextChar = $haystack[$key];
if ($nextChar == $previousCharacter) {
return $this->randomNotSame($haystack, $previousCharacter);
}
return $nextChar;
}
/**
* Generate and return a randomly generated password
* complete with Alpha, Numeric, Special
*
* @param integer $length
* @return string
*/
public function generate($length = 9)
{
if (!is_numeric($length)) {
$length = 9;
}
else {
$length = (int)$length;
}
$lowerAZ = array("a","b","c","d","e","f","g","h","j","k","m","n","p","q","r","s","t","u","v","w","x","y","z");
$upperAZ = array("A","B","C","D","E","F","G","H","J","K","M","N","P","Q","R","S","T","U","V","W","X","Y","Z");
$punctuation = array(",",".");
$special = array(';',"!","@","(",")","[","]","-","=","/","\\","*","%");
$full = array_merge(array_merge($lowerAZ, $upperAZ),array_merge($punctuation, $special));
$maxKey = (count($full) - 1);
$str = "";
$i = 0;
$previousChar = "";
while ($i < $length) {
$i++;
$next = $this->randomNotSame($full, $previousChar);
$str .= $next;
$previousChar = $next;
}
return $str;
}
/**
* Generate and return a randomly generated password
* complete with Alpha, Numeric, Special
*
* @param integer $length
* @return string
*/
public static function generateStatic($length = 9)
{
$class = new self();
return $class->generate($length);
}
}
Using the PHP Random Password Generator is easy. You can call it in 2 ways.
You can either call it in the traditional object initialisation method, or via static.
PHP Code:
<?php
$cl = new App_Data_Password();
$password = $cl->generate(9);
Here's the static way:
PHP Code:
<?php
$password = App_Data_Password::generateStatic(9);
Either way, you'd end up with a randomly generated password that's 9 characters in length.
I hope you find this helpful, it's a great addition to your class library.