Генератор паролей на PHP (список паролей)


Недавно передо мной  встала задача сгенерировать список паролей на PHP. Именно СПИСОК, а не один случайный пароль.

Например: Я скармливаю функции строку с возможными символами для генерации пароля и диапазоны длины паролей (например начинать с 4 символов, заканчивать 10 символами). В результате получаю массив всех всевозможных комбинаций состоящих из нужных символов в нужном диапазоне.

Задача, как оказалась не совсем простая - из раздела комбинаторики. Если с числами все просто (конкатенировать значение и все), то с буквами все куда сложнее. Пришлось отложить задачу на "долгую полку".

Недавно, абфусцируя один интересный shell, я увидел в нем эту возможность, и сразу решил её вытащить.

В результате я получил готовый класс для генерации списка паролей из заданного диапазона возможных символов.

Используется он так:

set_time_limit(0); // Бесконечное выполнение скрипта
//ignore_user_abort(1); // Продолжать работу при закрытии окна

$alphabet = '0123456789abcdefghijklmnopqrstuvwxyz_-';
$min = '4';
$max = '10';
$start = '2t8h';

echo 'Диапазон символов - '.$alphabet.'<br>';
echo 'Начальная длина пароля - '.$min.'<br>';
echo 'Конечная длина пароля - '.$max.'<br>';
echo 'Начинаем генерировать с '.$start.'<br>';

$psswrds = new pas_genpsw($alphabet, $min, $max, $start);
$password = $psswrds->generate();
while ($password !== null)
{
    echo $password.'<br>';
    $password = $psswrds->generate();
}

За что отвечает каждый из параметров, думаю понятно из кода.

В результате, на экран выводится список сгенерированных паролей в нужном диапазоне. Интересно то, что в функции имеется параметр $start, который указывает с какого пароля начинать. Благодаря нему можно останавливать процесс генерации и начинать генерировать список паролей с нужного места (генерация в несколько заходов).

Сам класс выглядит так:

class pas_genpsw
{
    var $alph = '';
    var $pos = 0;
    var $pass = '';
    var $len_alph = 0;
    var $len_min = 1;
    var $len_max = 1;
    var $len_now = 1;

    function pas_genpsw($alph, $len_min, $len_max, $pass_now)
    {
        $this->alph = $alph;
        $this->len_alph = strlen($alph) - 1;
        if (strlen($pass_now) > $len_min)
            $this->len_min = $this->len_now = strlen($pass_now);
        else
            $this->len_min = $this->len_now = $len_min;
        $this->len_max = $len_max;
        $this->pass = $pass_now;
        $this->pos = $this->len_min - 1;
    }
    
    function generate()
    {
        if ($this->pass == '')
		{
		$this->pass = str_repeat($this->alph[0], $this->len_min);
		}
        elseif ($this->pass[$this->pos] == $this->alph[$this->len_alph])
        {
        if ($this->pos == 0)
            {
            if ($this->len_now == $this->len_max)
				{
				$this->pass = null;
				}
                else
                {
				$this->pos = $this->len_now;
				$this->len_now++;
				$this->pass[0] = $this->pass[$this->pos] = $this->alph[0];
                }
            }
            else
            {
			$this->pass[$this->pos] = $this->alph[0];
			$this->pos--;
			$this->pass = $this->generate();
			$this->pos = $this->len_now - 1;
            }
        }
        else
        {
        $this->pass[$this->pos] = $this->alph[strpos($this->alph, $this->pass[$this->pos]) + 1];
        $this->pos = $this->len_now - 1;
        }
        return $this->pass;
    } 
}

Как видно, ничего сложного нет. Пока метод  generate() возвращает пароли, цикл будет выводить на экран новый пароль.

Код можно легко доработать, чтоб программа собирала пароли в массив или например формировала для каждого md5 и отправляла его в базу данных. Таким образом получим базу данных md5 хешей (очень, кстати, полезная вещьwink).

Используя данный класс, можно организовывать брутофорс (хоть и считаю что php не самый лучший вариант для брута).

 


Тэги:

Комментарии: 1

Прокомментировать »

 
 
Павел
16.06.2017
 

Здравствуйте а как сделать генерацию паролей в виде $hash = md5(md5($password . md5(sha1($salt)))); для 80 пользователей сразу? Заранее спасибо

 

Прокомментировать

 
 
Сообщение *
 
Проверочный код *
 
 
 
Яндекс.Метрика