| 
<?phpnamespace Jackbooted\Security;
 
 /*
 * @copyright Confidential and copyright (c) 2016 Jackbooted Software. All rights reserved.
 *
 * Written by Brett Dutton of Jackbooted Software
 * brett at brettdutton dot com
 *
 * This software is written and distributed under the GNU General Public
 * License which means that its source code is freely-distributed and
 * available to the general public.
 */
 
 /**
 * Description of Encryption
 *
 * @author bdutton
 */
 class Password extends \Jackbooted\Util\JB {
 
 /** Function to Generate a Password
 * @param $str Strength of the password
 * @param $len Length of the password
 * @returns var
 * @public
 */
 const LOWER_ALPHA =  1;
 const UPPER_ALPHA =  2;
 const NUMBERS     =  4;
 const SYMBOLS     =  8;
 const SIMPLE      =  3; // 1 | 2;
 const MEDIUM      =  7; // 1 | 2 | 4
 const COMPLEX     = 15; // 1 | 2 | 4 | 8;
 
 public static function passGen ( $len=8, $complexity=self::COMPLEX ) {
 // This is the array of group indexes. The reason that theere are 2 alpha
 // for upper and lower is that this gives a higher density of alpha
 // For example passGen ( 6, self::COMPLEX ) will give 2 upper case,
 // 2 lowercase one number and one symbol. This ratio seems to be the most readable
 // while keeping the password strength
 $letterGroupIndexes =  [ self::LOWER_ALPHA,
 self::LOWER_ALPHA,
 self::UPPER_ALPHA,
 self::UPPER_ALPHA,
 self::NUMBERS,
 self::SYMBOLS ];
 
 // These letter groups are chosen to remove the ambigious letters
 // In this case G l I 1 0 O o are all a little ambigious
 // Also the letter w is removed. In some fonts it is hard to read
 $letterGroups =  [ self::LOWER_ALPHA => 'abcdefghijkmnpqrstuvxyz',
 self::UPPER_ALPHA => 'ABCDEFHJKLMNPRSTUVXYZ',
 self::NUMBERS     => '23456789',
 self::SYMBOLS     => '@#$%^&*+?{}[]<>' ];
 $password = '';
 
 for ( $i=0; strlen( $password ) < $len; $i++ ) {
 $idx = $letterGroupIndexes[$i % count ( $letterGroupIndexes )];
 
 // Skip this group is the password is too complex
 if ( ( $idx & $complexity ) == 0 ) continue;
 
 $password .= substr ( str_shuffle ( $letterGroups[$idx] ), 0, 1 );
 }
 return str_shuffle ( $password );
 }
 
 
 }
 
 |