- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
<?php
define(STATIC_SALT, "herz_salt");
function generateRandChar()
{
$chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
$numChars = strlen($chars);
$string = '';
for ($i = 0; $i < rand(1, 7); $i++)
{
$string .= substr($chars, rand(1, $numChars) - 1, 1);
}
return $string;
}
$time = microtime(true) / 10000;
$str = $time - floor($time);
$str = (string)$str;
$str = preg_replace('/0./', '', $str);
$deleteNum = strlen($str);
if($deleteNum <= 5)
{
$str = substr($str, rand(0, 4));
}
elseif($deleteNum > 5 && $deleteNum <= 10)
{
$str = substr($str, rand(5, 9));
}
else $str = substr($str, rand(7, 9));
if(strlen($str) == 0)
{
$str = rand(0, 15000);
}
sleep(5);
$str = sha1(md5($str . STATIC_SALT . microtime(true))) . generateRandChar();
echo $str;
?>
а я уж было подумал, что хацкель
я многое в коде прощу, но вот это зря, оч зря
Это не паранойя, а непонимание основ криптографии.
> sleep(5)
Автору нет прощения.
Я вот не пойму, что пытался выразить автор сего творения. Генерацию случайного идентификатора? Тогда зачем все это. Все эти танцы с обрезаниями строк и хешем на хеше только делают результат МЕНЕЕ случайным...
это просто имитация крутого алгоритма, который работает аж целых пять секунд
ЕМНИП, rand() генерирует последовательность {x_i = a * x_{i-1} + b \bmod m}, что не очень секурно
А вообще что это? Попытка хэширования с рандомной солью и защитой от терморектального криптоанализа?
Вот лучше бы он sha погонял раз на 100 :) Все веселее.
> rand() генерирует последовательность {x_i = a * x_{i-1} + b \bmod m}
Угу. Поэтому что один rand(), что 100500 - криптостойкость от этого не повысится.
> Попытка хэширования с рандомной солью
Ну тут нет входной строки. Так что это просто рандомный идентификатор. Видимо для генерации ссылок на загрузку файла...
Путь настоящего похапшника - экономить на спикавычках (одинарные кавычки работают на 10 наносекунд быстрее!), не использовать проверенных алгоритмов (понаписали всякой непонятной херни, чем разбираться - лучше напишу свой!), не читать манов (зачем? все и так понятно!). Вот так :[
P.S. Archont12, поясните пожалуйста, для чего автор хотел применить (или, возможно, применил) данный код?
Решил похвастаться алгоритмом. )))
Примерно похожим (но не таким, конечно) способом работает генерация паролей во фряхе - вызывает 50 раз кажется MD5 с продуктом от прошлого MD5. Но вообще не важно какой именно алгоритм, главное чтобы не генерировать много похожих хешей, а тут вроде такого не случится.
Тут даже проблема немного в другом, хеширующие функции типа MD5 / SHA работают очень быстро, что делает перебор / подбор ключей проще. Хотя, конечно, просто вызвать надцать раз тот же MD5 / SHA было бы меньше кода :)
Но это же не авторизация? Здесь нет входной строки... А за генерацию ссылки на файл в течении 5 секунд мне всегда хотелось убивать...
Проблема в том, что код, который над 48й строкой, уменьшает количество возможных хешей. В $str возможны только пятизначные числа - т.е. около 99999 вариантов с хрен-пойми-каким распределением - в то же время обычный rand() на месте $str дал бы гораздо больше вариантов. Поэтому код выше 48й строки не имеет никакого смысла.
Для засолки и проверки паролей - важно. Попадался велосипедный "хеш", к которому можно было подбирать исходную строку с помощью листа бумаги, ручки и калькулятора ;)
А для генерации ссылки на загрузку видеофайла (http://govnokod.ru/10986#comment142672), конечно, пофиг. Тут бы uniqid() хватило.
По поводу кода выше / ниже: я сначала представил себе, что кроме пароля генерируется "шум", а потом там, где проверяется, он отрезается. Но если это файл то вообще непонятно зачем все это.
[quote]
By default, microtime() returns a string in the form "msec sec", where sec is the current time measured in the number of seconds since the Unix epoch (0:00:00 January 1, 1970 GMT), and msec is the number of microseconds that have elapsed since sec expressed in seconds.[/quote]
Время которое измеряется в числах секунд - кажется причины проблемы с датами начинают становиться более очевидными.
"и msec - это число микросекунд прошедших с sec измеряные в секундах"
Кого они меряли в секундах? Микросекунды?
sec expressed in seconds
sec измеряется в секундах с UNIX epoch
msec is the number of microseconds that have elapsed
msec измеряется в миллисекундах, сколько мс прошло с последней секунды.
"И msec - число микросекунд которые прошли с sec выраженн[ые/ых] в секундах."
Это так называемая garden path конструкция, или еще известная как dangling else - т.е. когда обстояетльство в предложении не возможно однозначно связать с одним из членов предложения (не понятно что выражено в секундах: если sec - то зачем повторять то что было только что сказано в этом же предложении, если msec - то как это они микросекунды в секундах меряют?)
Что же касается вашего утверждения о миллисекундах, то стоит отдельно заметить, что про миллисекунды тут речь не шла.
Отдельным пунктом можно добавить, что GMT не является стандартом для времени и его использование не рекомендовано, чтобы избежать разночтений, нужно пользоваться UTC, который в принципе то же самое, что GMT, но однозначно определен.
"И msec - число прошедших (куда?) микросекунд, потому что sec измеряется в секундах".
Последний вариант был бы наиболее предпочтителен для читателя не имееющего привычки читать технические тексты (написаные, как правило людьми страдающими крайней формой дислексии).
Функция возвращает строку из компонентов текущего времени от эпоча, равному сумме секунд и микросекунд, где микросекунды принимают значение от нуля до, вероятно, 0.999999990.99999900; именно про это и написано в справке, никаких вторых толкований быть не может. Никаких микросекунд в секундах там нет.
Программистом я был меньшую часть своей жизни, а большую - проработал газетчиком. Так вот, говорю я это к тому, что есть разные ошибки. Есть такие, которые очень любят искать в интернетах - типа тся и ться. Есть такие - которые меньше исчут в интернетах - типа запятых (т.как никто, если по-честному, то не знает где их ставить, даже в родственных языках правила различаются). И есть ошибки в построении предложения, это когда человек плохо понимает язык, на котором разгорваривает и, как следствие, выражается штампами. ВНИМАНИЕ, так разговаривают и пишут подавляющее большинство людей. Напирмер, для англоязычных нормально сказать ATM machine - т.е. когда толком не помнишь что именно стоит за аббревиатурой, то можно сказать глупость.)
Люди, которые осознанно составляют предложения - это люди которых этому научили. Так вот справка написана плохо в том смысле, что не срастаются части предложения во что-то, что можно назвать нормальным английским предложением. Более того, скорее всего писалась каким-нибудь Амиром Авихаем из Кирьят Мордехая или Петах Тиквы, и от желания подражать формализмам английского языка, который на экзамене Амира он сдал на троечку у него получилось то, что получилось.
Ну спасибо и на том, что вторым вариантом можно получить это время как double...
Называется CRC?
А CRC... ну да, тоже элементарно подбирается.