В общем темка довольно таки интересная. Решил в своём движке сделать такой метод хеширования пасов, чтобы даже самый умный ][, имеющий гигабайты словарей до старости брутил хеш)) Предполагается плюс ко всему солько. да и собственно у кого какие мысли по выделению соли? тоже интерсно было бы узнать) В общем кто на что способен, выкладывайте Маленький пример: PHP: function super_hash($pass) { $pass = hash_hmac('md5', md5(base64_encode(strrev($pass))), 'bugaga'); return $pass; } echo super_hash(12345);
PHP: <? function macrohash($string) { $b=bin2hex($string); $str = ''; $c=''; for($i=0; $i<=strlen($b)-2; $i+=2) { $sm=0; for($j=0; $j<=strlen($b-2); $j+=2) { $sm=$sm+hexdec(substr($b,$j,2)); } $asdf2=explode(".",$sm/3.1415927); $summab=$asdf2[1]; $x=hexdec(substr($b,$i,2)); $c.=dechex($x+intval(strlen($string)*$x)+$summab/$x); } if (strlen($c)<=32) { $d=''; for($i=0; strlen($d)<=32; $i+=2) { $sm=0; for($j=0; $j<=strlen($b-2); $j+=2) { $sm=$sm+hexdec(substr($b,$j,2)); } $asdf2=explode(".",$sm/3.1415927); $summab=$asdf2[1]; $d.=dechex(intval((hexdec(substr($c,$i,2))+strlen($d))*$summab*$x)); } $str=substr($d,strlen($d)-32,32); } elseif(strlen($c)>32) { $w=''; $c=substr($c,strlen($c)-5); for($i=0; strlen($w)<=32; $i+=2) { $sm=0; for($j=0; $j<=strlen($b-2); $j+=2) { $sm=$sm+hexdec(substr($b,$j,2)); } $asdf2=explode(".",$sm/3.1415927); $summab=$asdf2[1]; $w.=dechex(intval((hexdec(substr($c,$i,2))+strlen($w))*$summab*$x)); } $str=substr($w,0,32); } return $str; } ?> Моя функция хэширования без использования стандартных функций
Обычно использую просто двойной sha1 с салтом и "ключем", например так - ключ хранится в исходниках а не в базе, в роли салта - юзернейм : PHP: $key = "SomeReeeeeeeeealllyfriggginloooooooongstrrrrrrrrrrrrrinnnnnnng123432432432"; $hash = sha1($key.sha1($pass).$username) А вообще соглашусь с Isis, способов безконечно много даже используя комбинации классических алгоритмов хеширования. Пойдет любой, главное чтобы использовались салты и алгоритм небыл включен в известные брутеры.
Бред, почему не брутабельно? PHP: <?php $hash = ''; $file = file('slovar.txt'); for($i=0;$i<count($file);$i++) { if($hash == substr(sha1(md5(trim($file[$i]))), 0, 10)) { echo('pass: '.$file[$i]); break; } } ?> Да кстати алгоритм очень тупой, я уже раньше писал что в теории обрубание хеша напротив только увеличивает колизию, т.к. одному такому урезаному хешу будут соответсвовать n-ое число не урезанных хешей, т.е. к примеру, если для некоторой функции хеш от 1 = aaabb, а от 111 = aaacc, то получится что урезаному хешу aaa будет соответствовать и 1 и 111. Или говоря про небрутабельность ты имелл ввиду скорость? Если да, то не думаю что будет медлнее чем тот же мд5 юникс.
сгласен с тем что это бессмысленно. на данный момент существует порядком различных типов хеширования.тот же двойной sha1 с салтом при норм.пароле - будешь расшифровывать пол жизни.
PHP: <?php $key = (CRYPT_STD_DES == 1) ? substr(sha1('xyu'.md5('pizda'.base64_encode('siski'.strrev($_COOKIE['ip'].crypt('PASSWORD', 'sugar')).'xek').'gay').'crypt'), 3, 13) : ''; echo $key; ?> Вот такие вот пароленги у меня храняцо + если скрипт закодирован не скажу как.. Шансов 0
Гммм, действительно, это я не учел. Тем более, если злоумышленник получает доступ к нешифрованным исходникам, то dll'ку с используемым алгоритмом добавить проблемы не составит. Как вариант, использовать ресурсоёмкие алгоритмы по принципу MD5(UNIX), последовательно хешируя пароль несколько тысяч раз.
Дурак? Ты не думал о том что в веб-приложениях скорость выполнения сценария критична? Кому нужен двиг в котором что бы просто залогинится нужно ждать минут 10, а если пользователей одновременно 100,200,1000? Не думаю что каждый сервак справится с такой нагрузкой, если вообще справится. Алгоритм должен быть оптимальным во всех отношениях.
Какие простите 10 минут ? Извольте проверять ваши предположения перед тем как называть других дураками. PHP: cat md510ktest.php <?php $p = $argv[1]; for($i=0;$i<10000;$i++) { $p = md5($p); } echo $p; ?> time php md510ktest.php testtt4nuiehgiuheirhieuhrfiuheirfhierfhieuhrfihweifhriewhrfuhewoirfhiuh1 d40cc7fa978e4ee2da5223d99e1bbaaf real 0m0.109s user 0m0.080s sys 0m0.020s time php md510ktest.php testtt4nuiehgiuheirhieuhrfiuheirfhierfhieuhrfihweifhriewhrfuhewoirfhiuh2 0c03a4f78c217722f8cde1e94fbdc5e8 real 0m0.128s user 0m0.100s sys 0m0.020s time php md510ktest.php testtt4nuiehgiuheirhieuhrfiuheirfhierfhieuhrfihweifhriewhrfuhewoirfhiuh3 6974816458cb1f75e6cdf38989748c22 real 0m0.104s user 0m0.070s sys 0m0.020s time php md510ktest.php testtt4nuiehgiuheirhieuhrfiuheirfhierfhieuhrfihweifhriewhrfuhewoirfhiuh4 6c37418683998e2ec8cc2307eed57ad7 real 0m0.110s user 0m0.090s sys 0m0.010s time php md510ktest.php testtt4nuiehgiuheirhieuhrfiuheirfhierfhieuhrfihweifhriewhrfuhewoirfhiuh5 648fe28643dcfbafc3781dc81ae26f79 real 0m0.138s user 0m0.080s sys 0m0.040s Далее. Проверка хеша - операция сравнительно редкая, по сути используемая только в первичной аутентификации и регистрации. Потратить на неё ресурсов в 100-10000 раз больше чем обычно - ИМХО вполне допустимо.
Мд5 Юникс, это не тоже самое что мд5() в пхп, скорость хеширования отличается существенно. Ты написал про MD5 UNIX, а на примере показал мд5(), ты попробуй прогони MD5 UNIX раз этак тысячу, а потом уже говори что либо.
Я НЕ писал о последовательном применении MD5(UNIX), я писал о применении алгоритмов, использующих идеи MD5(UNIX). Разница надеюсь очевидна ? MD5(UNIX) от обычного md5 в часности и отличается циклическим применением последнего в первом несколько тысяч раз.
Ты всеравно не думаешь о последствиях, если пароль будет хешироваться тысячу раз, то сервак намного легче задосить (написать скрипт который будет постоянно кидать пасс не сложно, а вот из-за такого хеширования нагрузка будет более существенной), т.к. такую направленную нагрузку он не выдержит.
при увеличение количества операция взятия хеша, число возможных коллизий увеличиваеться в геометрической прогрессии