понедельник, 19 сентября 2011 г.

Генератор читабельного пароля на PHP


Стойкие пароли, состоящие из всевозможных символов и букв в разном регистре, штука, конечно хорошая! Но не стоит забывать, что один лишь вид подобных "произведений искусства"  вызывает естественное чувство отторжения мало кто отважится набивать каждый раз такое вручную:
k*qT$6GQT3

Про людей которые помнят на память несколько серийных кодов для Windows ходят легенды, думаю, что такие пароли  придумали именно для них.


Ну а нормальный человек с удовольствием запишет этот пароль в отдельный файл, менеджер паролей или просто заменит на чей-то день рождения или что там еще... Обидно, да?


Имеет резон сделать генератор, который будет создавать запоминающийся пароль.Вот простой пример:


<?php
function generate_password($length = 10){
    $chars1 = 'aeiouy';
    $chars2 = 'bcdfghklmnprstvz';
    $password = '';
    $bound = ceil($length/2.0);
    for ($i=0; $i<$bound; $i++){
        $password .= substr($chars2, mt_rand(0, strlen($chars2)-1), 1);
        if (strlen($password) < $length){
            $password .= substr($chars1, mt_rand(0, strlen($chars1)-1), 1);
        }
    }
    return $password;
}
 
print generate_password(6);
?>

Тут все элементарно - случайные гласные чередуются со случайными согласными.

Вот примеры паролей, созданных данным скриптом:

pepelo
keneso
rezimo
legino
mobify
pohony
zanuzi
favyry
nynuvi


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

9 комментариев:

  1. function passgen($l=8)
    {
    $c = array('bcdfghklmnprstvz','aeiouy');
    for ($p=NULL,$i=0;$i<$l;++$i)
    $p .= $c[$i%2][mt_rand(0,strlen($c[$i%2])-1)];
    return $p .= mt_rand(0,99);
    }

    ОтветитьУдалить
  2. А ещё лучше вот так.

    function passgen($l=8)
    {
    $a = array('bcdfghklmnprstvz','aeiouy');
    for ($p=NULL,$c=0,$i=mt_rand(0,1);$c<$l;++$c)
    $p .= $a[($c+$i)%2][mt_rand(0,strlen($a[($c+$i)%2])-1)];
    return $p .= mt_rand(0,99);
    }

    adyvokuc51
    cyhumymi27
    inazavac48
    dizirohe96
    aducukys43

    P.S. Спасибо вам за идею, реализовал, как видите, по своему :)

    ОтветитьУдалить
  3. Ваш код выбирает с чего начинать (гласные/согласные) и дописывает в конец числа и это хорошо!

    Интересный у Вас стиль программирования - максимум смысла в каждой строке кода :)
    Читаешь, такой исходник и становишься умнее. Только не уверен, что ошибки при таком стиле удобно искать.

    P.S.: Когда писал эту статью сам еле удержался вставить свой реальный код - развивать идею можно бесконечно долго. Поэтому отразил только суть и ничего более.

    ОтветитьУдалить
  4. В моём понимании весь код должен быть именно таким, что бы содержать максимальный функционал, при минимальном объёме кода, быть защищённым от любых действий со входными данными или при их отсутствии и выполняться как можно быстрее.
    Если расставить пробелы и табуляцию, нормально (тут их сайт урезал), то код очень да же понятный и читаемый.
    Дебажить такой код, как раз легко и удобно, причём после меня никому это делать и не приходилось. :)

    ОтветитьУдалить
  5. Да я тоже так любил делать, но через годик смотришь на такой код и такое ощущение, что его другой человек писал...
    Вот прикинь если тебе надо будет расширить функционал и что-то добавить в строчку:
    $p .= $a[($c+$i)%2][mt_rand(0,strlen($a[($c+$i)%2])-1)];
    А если это будет сделано несколько раз я представляю во что она превратиться :)
    Впрочем, о вкусах не спорят. Тем более, если это не коллективная разработка.
    На самом деле мне твой стиль понравился - читать интересно. Не сравнить с моим унылым примером в статье.

    ОтветитьУдалить
  6. Мой стиль не подразумевает везде и всегда лепить всё в одну строчку не юзая переменных вообще, а избавлятся от них там, где это можно сделать без ущерба для читаемости.
    Ущерб для читаемости - это конечно понятие относительное, я ориентируюсь маркером длинной строки в своём текстовом редакторе.
    Если ту строчку нужно будет модифицировать, то понятное дело, ($c+$i)%2 или во что там придётся это определить, я возьму в переменную, но для меня это выражение слишком простое и короткое и я не видел смысла брать её в переменную, да ещё и впридачу брать в скобки весь блок for это ведь сразу +3 строки.

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

    ОтветитьУдалить
  8. 1 Рабочий вариант
    static private function passgen()
    {
    $a = array('bcdfghklmnprstvz','aeiouy');
    for ($p=NULL,$c=0,$i=mt_rand(0,1);$c<8;++$c)
    {
    $b = ($c+$i)%2;
    $p .= $a[$b][mt_rand(0,strlen($a[$b])-1)];
    }
    return $p .= mt_rand(0,99);
    }
    2
    >оптимизацией тут даже не пахнет, скорей "абы короче"
    Вы сравните исходный предложенный вариант с этим. Если вы не видите никакой разницы, то купите очки!
    3
    >подобный говнокод
    Всяких рукожопых критиков, по мнению которых все говно, а только они Д'Артаньяны, в рунете хватает с головой, и им уже никто не удивляется.
    Прежде чем этот код называть говнокодом - предложите свой, православный, вариант!
    4
    >Используются две лишних операции (сложение и mod) внутри цикла...
    Как я писал ранее, языком валять, много ума не нужно, предложите свой идеальный код, выполняющий аналогичный моему функционал!

    ОтветитьУдалить
  9. Не хами, плесень. Разницу я вижу, вот только не ясно, зачем это "сокращение" кода, если ты тут же лишний mod в цикле въебенил :)

    Твой "рабочий" код инстинно правильный, а вот тот что комментировал я – недопустимый пиздец. А разница-то в одной переменной :)

    Если не понял мой первый коммент – сходи на курсы по правильному программингу. Почитай про оптимизацию ресурсов, кода, юнит-тесты и бенчмарки.

    ОтветитьУдалить