Стойкие пароли, состоящие из всевозможных символов и букв в разном регистре, штука, конечно хорошая! Но не стоит забывать, что один лишь вид подобных "произведений искусства" вызывает естественное чувство отторжения мало кто отважится набивать каждый раз такое вручную:
Про людей которые помнят на память несколько серийных кодов для Windows ходят легенды, думаю, что такие пароли придумали именно для них.
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
На базе этого кода можно генерировать достаточно стойкие пароли, которые проще читать и вводить. Я использую код посложнее для реализации различных политик по безопасности пароля, но идея, думаю, понятна.
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);
}
А ещё лучше вот так.
ОтветитьУдалить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. Спасибо вам за идею, реализовал, как видите, по своему :)
Ваш код выбирает с чего начинать (гласные/согласные) и дописывает в конец числа и это хорошо!
ОтветитьУдалитьИнтересный у Вас стиль программирования - максимум смысла в каждой строке кода :)
Читаешь, такой исходник и становишься умнее. Только не уверен, что ошибки при таком стиле удобно искать.
P.S.: Когда писал эту статью сам еле удержался вставить свой реальный код - развивать идею можно бесконечно долго. Поэтому отразил только суть и ничего более.
В моём понимании весь код должен быть именно таким, что бы содержать максимальный функционал, при минимальном объёме кода, быть защищённым от любых действий со входными данными или при их отсутствии и выполняться как можно быстрее.
ОтветитьУдалитьЕсли расставить пробелы и табуляцию, нормально (тут их сайт урезал), то код очень да же понятный и читаемый.
Дебажить такой код, как раз легко и удобно, причём после меня никому это делать и не приходилось. :)
Да я тоже так любил делать, но через годик смотришь на такой код и такое ощущение, что его другой человек писал...
ОтветитьУдалитьВот прикинь если тебе надо будет расширить функционал и что-то добавить в строчку:
$p .= $a[($c+$i)%2][mt_rand(0,strlen($a[($c+$i)%2])-1)];
А если это будет сделано несколько раз я представляю во что она превратиться :)
Впрочем, о вкусах не спорят. Тем более, если это не коллективная разработка.
На самом деле мне твой стиль понравился - читать интересно. Не сравнить с моим унылым примером в статье.
Мой стиль не подразумевает везде и всегда лепить всё в одну строчку не юзая переменных вообще, а избавлятся от них там, где это можно сделать без ущерба для читаемости.
ОтветитьУдалитьУщерб для читаемости - это конечно понятие относительное, я ориентируюсь маркером длинной строки в своём текстовом редакторе.
Если ту строчку нужно будет модифицировать, то понятное дело, ($c+$i)%2 или во что там придётся это определить, я возьму в переменную, но для меня это выражение слишком простое и короткое и я не видел смысла брать её в переменную, да ещё и впридачу брать в скобки весь блок for это ведь сразу +3 строки.
Искренне надеюсь, что вы уже переросли подобный говнокод. Ибо оптимизацией тут даже не пахнет, скорей "абы короче". Используются две лишних операции (сложение и mod) внутри цикла...
ОтветитьУдалить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) внутри цикла...
Как я писал ранее, языком валять, много ума не нужно, предложите свой идеальный код, выполняющий аналогичный моему функционал!
Не хами, плесень. Разницу я вижу, вот только не ясно, зачем это "сокращение" кода, если ты тут же лишний mod в цикле въебенил :)
ОтветитьУдалитьТвой "рабочий" код инстинно правильный, а вот тот что комментировал я – недопустимый пиздец. А разница-то в одной переменной :)
Если не понял мой первый коммент – сходи на курсы по правильному программингу. Почитай про оптимизацию ресурсов, кода, юнит-тесты и бенчмарки.