Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Генерация паролей


Автор: Гость_Dender 15.5.2005, 10:35
Народ, скажите, плиз, как в PHP сгенирировать пароль, т.е. строка, состоящая из случайных цифр и букв.

Автор: InfMag 15.5.2005, 10:42
Не судите строго, это помоему мой 3-ий скрипт из самых первых. smile
Код

<html>
<head>
<title>Random</title>
</head>
<body>
<table border=0 width=100% height=100%>
<tr>
<td align=center>
<?php
 if (isset($_GET['s']) && $_GET['s'] == "result") {
     if (isset($_POST['cb']) && $_POST['cb']==true) {
  for ($i=0; $i<$_POST['syb']; $i++) {
   switch (rand(1,36)) {
    default: echo "0"; break;
    case 1: echo "1"; break;
    case 2: echo "2"; break;
    case 3: echo "3"; break;
    case 4: echo "4"; break;
    case 5: echo "5"; break;
    case 6: echo "6"; break;
    case 7: echo "7"; break;
    case 8: echo "8"; break;
    case 9: echo "9"; break;
    case 10: echo "0"; break;
    case 11: echo "q"; break;
    case 12: echo "w"; break;
    case 13: echo "e"; break;
    case 14: echo "r"; break;
    case 15: echo "t"; break;
    case 16: echo "y"; break;
    case 17: echo "u"; break;
    case 18: echo "i"; break;
    case 19: echo "o"; break;
    case 20: echo "p"; break;
    case 21: echo "a"; break;
    case 22: echo "s"; break;
    case 23: echo "d"; break;
    case 24: echo "f"; break;
    case 25: echo "g"; break;
    case 26: echo "h"; break;
    case 27: echo "j"; break;
    case 28: echo "k"; break;
    case 29: echo "l"; break;
    case 30: echo "z"; break;
    case 31: echo "x"; break;
    case 32: echo "c"; break;
    case 33: echo "v"; break;
    case 34: echo "b"; break;
    case 35: echo "n"; break;
    case 36: echo "m"; break;}}
     } else {
  for ($i=0; $i<$_POST['syb']; $i++) {
   switch (rand(1,62)) {
    default: echo "0"; break;
    case 1: echo "1"; break;
    case 2: echo "2"; break;
    case 3: echo "3"; break;
    case 4: echo "4"; break;
    case 5: echo "5"; break;
    case 6: echo "6"; break;
    case 7: echo "7"; break;
    case 8: echo "8"; break;
    case 9: echo "9"; break;
    case 10: echo "0"; break;
    case 11: echo "q"; break;
    case 12: echo "w"; break;
    case 13: echo "e"; break;
    case 14: echo "r"; break;
    case 15: echo "t"; break;
    case 16: echo "y"; break;
    case 17: echo "u"; break;
    case 18: echo "i"; break;
    case 19: echo "o"; break;
    case 20: echo "p"; break;
    case 21: echo "a"; break;
    case 22: echo "s"; break;
    case 23: echo "d"; break;
    case 24: echo "f"; break;
    case 25: echo "g"; break;
    case 26: echo "h"; break;
    case 27: echo "j"; break;
    case 28: echo "k"; break;
    case 29: echo "l"; break;
    case 30: echo "z"; break;
    case 31: echo "x"; break;
    case 32: echo "c"; break;
    case 33: echo "v"; break;
    case 34: echo "b"; break;
    case 35: echo "n"; break;
    case 36: echo "m"; break;
    case 37: echo "Q"; break;
    case 38: echo "W"; break;
    case 39: echo "E"; break;
    case 40: echo "R"; break;
    case 41: echo "T"; break;
    case 42: echo "Y"; break;
    case 43: echo "U"; break;
    case 44: echo "I"; break;
    case 45: echo "O"; break;
    case 46: echo "P"; break;
    case 47: echo "A"; break;
    case 48: echo "S"; break;
    case 49: echo "D"; break;
    case 50: echo "F"; break;
    case 51: echo "G"; break;
    case 52: echo "H"; break;
    case 53: echo "J"; break;
    case 54: echo "K"; break;
    case 55: echo "L"; break;
    case 56: echo "Z"; break;
    case 57: echo "X"; break;
    case 58: echo "C"; break;
    case 59: echo "V"; break;
    case 60: echo "B"; break;
    case 61: echo "N"; break;
    case 62: echo "M"; break;
    }
   }
  }
 } else {
  echo "<form action=?s=result method=post>";
  echo "<select name=syb>";
  echo "<option selected value=1>1</option>";
  echo "<option value=2>2</option>";
  echo "<option value=3>3</option>";
  echo "<option value=4>4</option>";
  echo "<option value=5>5</option>";
  echo "<option value=6>6</option>";
  echo "<option value=7>7</option>";
  echo "<option value=8>8</option>";
  echo "<option value=9>9</option>";
  echo "<option value=10>10</option>";
  echo "<option value=11>11</option>";
  echo "<option value=12>12</option>";
  echo "<option value=13>13</option>";
  echo "<option value=14>14</option>";
  echo "<option value=15>15</option>";
  echo "<option value=16>16</option>";
  echo "<option value=17>17</option>";
  echo "<option value=18>18</option>";
  echo "<option value=19>19</option>";
  echo "<option value=20>20</option>";
  echo "</select><br>";
  echo "Small: <input type=checkbox name=cb><br>";
  echo "<input type=submit value=\"OK\">";
  echo "</form>";
 }
?>
</td>
</tr>
</table>
</body>
</html>

Добавлено @ 10:44
Тока rand() выдает псевдослучайные числа. smile
Надо будет мне новенький скрипт подделать. Чтобы тама одна строчка была, цикл и substr() усе вырезать по нормальной генерации. smile

Автор: Гость_Dender 15.5.2005, 10:46
А есть какая-нибудь функция или алгоритм в PHP в 2-3 строчки кода?

Автор: InfMag 15.5.2005, 10:52
На мой взгяд - нет. smile

Автор: Ну, к примеру 15.5.2005, 11:03
Можно ж и так:

$sql = "select PASSWORD('". rand(10, 100) ."')";
$sqlResult = mysql_query($sql);
$readyPas = mysq_result($sqlResult);

только не удобно

Автор: Mal Hack 15.5.2005, 12:01
Где-то я уже выкладывал:
Код
<?php

function generate_pass( $m )
  {
   $pass = "";

   for( $i = 0 ; $i < $m ; $i++ )
    {
     $te = mt_rand( 48 , 122 );

     if( ( $te > 57 &&  $te < 65 ) || ( $te > 90 &&  $te < 97 ) )
      {  $te = $te - 9;  }

     $pass .= chr( $te );
    }

   return $pass;
  }

print generate_pass( 32 );

?>

Автор: Aliance 15.5.2005, 12:28
www.manlix.ru - там есть этот скрипт. сделан отлично smile

Автор: IZ@TOP 15.5.2005, 21:21
А чем Вас не устраивает обычное комбинирование из символов?

Код

function randPswd($num) {
    $ret = '';
    $chars = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_-';
    for($i = 0; $i < $num; $i++) {
        $ret .= $chars[round(0, sizeof($chars)-1)];
    }
    return $ret;
}

echo randPswd(10);

Автор: InfMag 15.5.2005, 22:28
IZ@TOP
Вот то, что я хотел сделать! smile smile

Автор: InfMag 15.5.2005, 22:45
А вот та функция, которая выполняет все мои требования: smile
Код

<?php

function genpass($n, $numbers, $uppers, $lowers)
{
    $chars = "";
    $res = "";
    if ($numbers == 1) $chars .= "0123456789";
    if ($uppers == 1) $chars .= "QWERTYUIOPASDFGHJKLZXCVBNM";
    if ($lowers == 1) $chars .= "qwertyuiopasdfghjklzxcvbnm";
    if ($numbers != 1 && $uppers != 1 && $lowers != 1)
    $chars .= "0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
    for ($i=0; $i<$n; $i++) $res .= $chars[mt_rand(0, sizeof($chars)-1)];
    return $res;
}

?>

Автор: Gold Dragon 16.5.2005, 08:03
А разве нет шанса что пароль повториться?

Автор: dm9 16.5.2005, 09:26
Есть. Также есть шанс, что ты при брутфорсе чужого пароля угадаешь его с первого раза smile

Автор: InfMag 16.5.2005, 16:56
Red Dragon
ИМХО: Глупый вопрос.
Вот возьми пару чифр: 1 и 2.
Сначала по случайности выпадает 2, потом 1 и что? Разве может выпасть что-то еще?
Точно также ты можешь чихнуть и ударить носом по клаве,.. вдруг понимаешь, что набрал носом пароль от пентагона. smile

Автор: Mal Hack 16.5.2005, 17:08
Цитата(InfMag @ 16.5.2005, 17:56)
Сначала по случайности выпадает 2, потом 1 и что? Разве может выпасть что-то еще?

1,5 ?

Автор: dm9 16.5.2005, 17:28
smile

Автор: Gold Dragon 16.5.2005, 18:42
ой засмеяли.... если вопрос глупый чтож отвечаете smile Я просто имел в виду, может как-нибудь через время генерить

Автор: dm9 16.5.2005, 18:46
Так все предыдущие решения строятся на рандоме smile
Он в разных языках по-разному работает, конечно. Но тут варианта два. Либо он работает от таймера сразу. Либо он генерит всегда одно и то же, и тогда надо выполнить что-то типа паскалевского Randomize. И тогда тоже всё станет хорошо.

Автор: Mal Hack 16.5.2005, 19:00
Цитата(dm9 @ 16.5.2005, 19:46)
Он в разных языках по-разному работает, конечно. Но тут варианта два. Либо он работает от таймера сразу. Либо он генерит всегда одно и то же, и тогда надо выполнить что-то типа паскалевского Randomize.

Ну в Си это от системного времни берется, В Паскале вроде как от тактов процессора зависит. В PHP - просто формула. от времени наверное.
Добавлено @ 19:02
Хотя не наверное, а точно.. Больше не от чего.

Автор: InfMag 16.5.2005, 22:41
Канешь от времени! Тут и думать не нада.
Ведь как бы он выдавал случайные числа. В компе бесперебойный таймер - тока биос.

Автор: Irokez 17.5.2005, 21:14
Цитата(InfMag @ 15.5.2005, 22:45)

$chars = "0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";

Код

$chars = implode('', range('0', '9')) . implode('', range('a', 'z')) . implode('', range('A', 'Z'));

Автор: IZ@TOP 18.5.2005, 00:22
Irokez, интересно что быдет быстрее работать... ?

Автор: Irokez 18.5.2005, 11:12
IZ@TOP, а что читабельнее и понятнее... ?

Автор: mike_prog 18.5.2005, 16:40
Код

$password = md5(uniqid(microtime(), 1) . getmypid);  

Хороший пароль, не угадаешь, не запомнишь и не введешь никогда.

Автор: Mal Hack 18.5.2005, 16:47
md5 умер smile И потом в таком уж случае, надо использовать сводные хэши на 40-50 символов. Вот тут точно фиг угадаешь.

Автор: Irokez 18.5.2005, 16:51
Цитата(Mal @ 18.5.2005, 16:47)
md5 умер smile

это еще почему smile

Автор: InfMag 18.5.2005, 16:57
Irokez
Читабельнее и быстрее по работе будет уже забитая строчка.
Думаю ее не так уж и трудно будет написать, а лишний вызов функций - лишнее время!
Ты создаешь для себя или для других.
Вариант "читабельнее и понятнее" не путь к профессионализму. smile

Автор: dm9 18.5.2005, 16:58
Вроде, была где-то статейка, что его научились расшифровывать smile

Автор: Mal Hack 18.5.2005, 17:02
Цитата(dm9 @ 18.5.2005, 17:58)
Вроде, была где-то статейка, что его научились расшифровывать smile

Нет, не расшифровыват %smile Это нереально. Тут где-то тема была.
http://forum.vingrad.ru/index.php?showtopic=45102

Автор: Irokez 18.5.2005, 17:06
Цитата(InfMag @ 18.5.2005, 16:57)
Вариант "читабельнее и понятнее" не путь к профессионализму. smile

как раз таки наоборот, многие профессиональные программисты являются сторонниками KISS (Keep It Simple Sidney), лучше написать как проще, чем как эффективнее (естественно в разумных пределах)
Добавлено @ 17:08
Цитата(dm9 @ 18.5.2005, 16:58)
Вроде, была где-то статейка, что его научились расшифровывать smile

расшифровать md5 невозможно, т.к. это алгоритм хеширования, а ту статью я читал, если не ошибаюсь там говорилось всего навсего об уменьшении времени необходимого для брутфорса

Автор: dm9 18.5.2005, 17:11
Да, точно smile
Но в данном случае это тоже может привести к нехорошим результатам.

Добавлено @ 17:12
Это я сказал к комментарию Мал Хака.

Автор: InfMag 18.5.2005, 17:40
Irokez
Значит - это не профи. Простейший ответ.
Программисты должны заботиться не о себе, а о других. Такова теория программирования.

Вот представь, если бы этот форум IPB при обращении на каждую страницу занимал по пару минут? А при критике кодеры бы говорили - Keep It Simple Sidney и нас ниче больше не интересует...
ИМХО: без обид, но теория KISS просто смешная.

Автор: dm9 18.5.2005, 17:42
Гы. А если бы код форума IPB выглядел бы так, что "чёрт ногу сломит"?

Тебе же никто не предлагает писать так, чтобы ответ форума был 2 минуты. Но удобочитаемось кода - необходимое условие расширяемости smile

Автор: InfMag 18.5.2005, 17:44
dm9
Заметь, я не предлагаю писать на машинном двоичном коде. Я предлагаю писать на языке программирования.
А для сторонников KISS - go to Basic...
Добавлено @ 17:47
И кстати хочу отметить!
Вы сейчас видимо сидите на ветке билдера и вероятно пользуютесь им. Не думаю, что кто-то еще не отметил большой размер exe'шников.
Видимо фирма борланд придерживается теории KISS... Многие отказываются из-за этого от билдера. Я сейчас осваиваю VC Qt, поскольку билдер меня не устраивает. smile

Вот и вся ваша теория KISS...
Добавлено @ 17:47
Ох, сорри думал сижу в Borland C++ Builder... smile
Добавлено @ 17:48
И таже история с Delphi... smile

Автор: Alx 18.5.2005, 17:54
smile

Автор: Irokez 18.5.2005, 18:01
причем тут Builder, Qt и С++ ...

Цитата(InfMag @ 18.5.2005, 17:40)
Значит - это не профи. Простейший ответ.

вряд ли не профи стали бы писать мануал по перлу и книги по теории компиляции ...

Автор: InfMag 18.5.2005, 18:10
Irokez
Слушай, давай окончим этот разговор, а то раздеремся. Каждый будет придерживаться своей теории. smile

Автор: Irokez 18.5.2005, 18:12
Цитата(InfMag @ 18.5.2005, 18:10)
Слушай, давай окончим этот разговор, а то раздеремся.

deal

Автор: coyl 4.1.2007, 17:03
Цитата(Irokez @  17.5.2005,  21:14 Найти цитируемый пост)
$chars = implode('', range('0', '9')) . implode('', range('a', 'z')) . implode('', range('A', 'Z'));

Цитата(IZ@TOP @  18.5.2005,  00:22 Найти цитируемый пост)
Irokez, интересно что быдет быстрее работать... ? 

Первый вариант будет работать быстрее, но настолько малой будет разница, что тут и спорить бессмысленно. Это стоит учитывать, если в секунду надо сгенерить миллиарда два паролей \гипербола\, но в таких случаях не подходят не просто оба этих варианта. Тут просто не подходит сам ПХП. надо писать на асме. Так что тут кому что больше нравится, а производительность будет неразличима. Мне лично понравился вариант ирокеза. Взял на заметку =))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)