Просмотр полной версии : [Web-извращенцам] хеширование
.:EnoT:.
29.02.2008, 05:16
В общем темка довольно таки интересная.
Решил в своём движке сделать такой метод хеширования пасов, чтобы даже самый умный ][, имеющий гигабайты словарей до старости брутил хеш))
Предполагается плюс ко всему солько. да и собственно у кого какие мысли по выделению соли? тоже интерсно было бы узнать)
В общем кто на что способен, выкладывайте :)
Маленький пример:
function super_hash($pass)
{
$pass = hash_hmac('md5', md5(base64_encode(strrev($pass))), 'bugaga');
return $pass;
}
echo super_hash(12345);
Тема интересна, если не использовать стандартные алгоритмы типа md5 и base64
$pwd=substr(sha1(md5($password)), 0, 10);
анбрутабл, никаких солей, места в бд занимает немного =)
.:EnoT:.
29.02.2008, 07:09
Бред....
Способов куча
дргого ответа от тебя ожидать было бы глупо)
раз куча способов - выкладывай, буду только рад :)
<?
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 с салтом и "ключем", например так - ключ хранится в исходниках а не в базе, в роли салта - юзернейм :
$key = "SomeReeeeeeeeealllyfriggginloooooooongstrrrrrrrrrr rrrinnnnnnng123432432432";
$hash = sha1($key.sha1($pass).$username)
А вообще соглашусь с Isis, способов безконечно много даже используя комбинации классических алгоритмов хеширования. Пойдет любой, главное чтобы использовались салты и алгоритм небыл включен в известные брутеры.
$pwd=substr(sha1(md5($password)), 0, 10);
анбрутабл, никаких солей, места в бд занимает немного =)
Бред, почему не брутабельно?
<?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 с салтом при норм.пароле - будешь расшифровывать пол жизни.
blackybr
29.02.2008, 14:19
Обычно использую просто двойной sha1 с салтом и "ключем", например так - ключ хранится в исходниках а не в базе, в роли салта - юзернейм :
$key = "SomeReeeeeeeeealllyfriggginloooooooongstrrrrrrrrrr rrrinnnnnnng123432432432";
$hash = sha1($key.sha1($pass).$username)
А вообще соглашусь с Isis, способов безконечно много даже используя комбинации классических алгоритмов хеширования. Пойдет любой, главное чтобы использовались салты и алгоритм небыл включен в известные брутеры.
с тех пор как паспро стал модульным, это не актуально
<?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), последовательно хешируя пароль несколько тысяч раз.
Гммм, действительно, это я не учел. Тем более, если злоумышленник получает доступ к нешифрованным исходникам, то dll'ку с используемым алгоритмом добавить проблемы не составит.
Как вариант, использовать ресурсоёмкие алгоритмы по принципу MD5(UNIX), последовательно хешируя пароль несколько тысяч раз.
Дурак? Ты не думал о том что в веб-приложениях скорость выполнения сценария критична? Кому нужен двиг в котором что бы просто залогинится нужно ждать минут 10, а если пользователей одновременно 100,200,1000? Не думаю что каждый сервак справится с такой нагрузкой, если вообще справится.
Алгоритм должен быть оптимальным во всех отношениях.
guest3297
29.02.2008, 14:47
Умные хакеры всегда, смотрят исходники что как зашифровано и закодированно, так что вы всосете!
nc.STRIEM
29.02.2008, 14:54
тема херня, способов масса, и зная алгоритм брутиться все
Дурак? Ты не думал о том что в веб-приложениях скорость выполнения сценария критична? Кому нужен двиг в котором что бы просто залогинится нужно ждать минут 10, а если пользователей одновременно 100,200,1000? Не думаю что каждый сервак справится с такой нагрузкой, если вообще справится.
Алгоритм должен быть оптимальным во всех отношениях.
Какие простите 10 минут ?
Извольте проверять ваши предположения перед тем как называть других дураками.
cat md510ktest.php
<?php
$p = $argv[1];
for($i=0;$i<10000;$i++)
{
$p = md5($p);
}
echo $p;
?>
time php md510ktest.php testtt4nuiehgiuheirhieuhrfiuheirfhierfhieuhrfihwei fhriewhrfuhewoirfhiuh1
d40cc7fa978e4ee2da5223d99e1bbaaf
real 0m0.109s
user 0m0.080s
sys 0m0.020s
time php md510ktest.php testtt4nuiehgiuheirhieuhrfiuheirfhierfhieuhrfihwei fhriewhrfuhewoirfhiuh2
0c03a4f78c217722f8cde1e94fbdc5e8
real 0m0.128s
user 0m0.100s
sys 0m0.020s
time php md510ktest.php testtt4nuiehgiuheirhieuhrfiuheirfhierfhieuhrfihwei fhriewhrfuhewoirfhiuh3
6974816458cb1f75e6cdf38989748c22
real 0m0.104s
user 0m0.070s
sys 0m0.020s
time php md510ktest.php testtt4nuiehgiuheirhieuhrfiuheirfhierfhieuhrfihwei fhriewhrfuhewoirfhiuh4
6c37418683998e2ec8cc2307eed57ad7
real 0m0.110s
user 0m0.090s
sys 0m0.010s
time php md510ktest.php testtt4nuiehgiuheirhieuhrfiuheirfhierfhieuhrfihwei fhriewhrfuhewoirfhiuh5
648fe28643dcfbafc3781dc81ae26f79
real 0m0.138s
user 0m0.080s
sys 0m0.040s
Далее.
Проверка хеша - операция сравнительно редкая, по сути используемая только в первичной аутентификации и регистрации.
Потратить на неё ресурсов в 100-10000 раз больше чем обычно - ИМХО вполне допустимо.
Как вариант, использовать ресурсоёмкие алгоритмы по принципу MD5(UNIX), последовательно хешируя пароль несколько тысяч раз.
Какие простите 10 минут ?
$p = md5($p);
Мд5 Юникс, это не тоже самое что мд5() в пхп, скорость хеширования отличается существенно. Ты написал про MD5 UNIX, а на примере показал мд5(), ты попробуй прогони MD5 UNIX раз этак тысячу, а потом уже говори что либо.
Мд5 Юникс, это не тоже самое что мд5() в пхп, скорость хеширования отличается существенно. Ты написал про MD5(UNIX), а на примере показал мд5(), ты попробуй прогони MD5(UNIX) раз этак тысячу, а потом уже говори что либо.
Как вариант, использовать ресурсоёмкие алгоритмы по принципу MD5(UNIX), последовательно хешируя пароль несколько тысяч раз.
Я НЕ писал о последовательном применении MD5(UNIX), я писал о применении алгоритмов, использующих идеи MD5(UNIX). Разница надеюсь очевидна ?
MD5(UNIX) от обычного md5 в часности и отличается циклическим применением последнего в первом несколько тысяч раз.
MD5(UNIX) от обычного md5 в часности и отличается циклическим применением последнего в первом несколько тысяч раз.
Ты всеравно не думаешь о последствиях, если пароль будет хешироваться тысячу раз, то сервак намного легче задосить (написать скрипт который будет постоянно кидать пасс не сложно, а вот из-за такого хеширования нагрузка будет более существенной), т.к. такую направленную нагрузку он не выдержит.
nc.STRIEM
29.02.2008, 15:18
при увеличение количества операция взятия хеша, число возможных коллизий увеличиваеться в геометрической прогрессии
Криптовальщики...
А объясните мне, чем плох дабл md5 с солью по вкусу? Даже если ][ будет знать соль, то брутить 32 - х символьный хэш он будет ооочень долго... а потом еще раз...
бред :DDDDD
это имело бы место толкьо в случае если бы сам пароль был бы в виде мд5 хэша :d
мдя... насмешил, ты думай, а потом пиши
т.к. такую направленную нагрузку он не выдержит.
Это верно только в случае если логин скрипт окажется самой тяжелой частью системы. Если у меня скрипт отправки сообщения исполняется скажем 3 секунды, а логин 0.5 секунды, то катастрофы от увеличения времени исполнения последнего до 1-2 секунд не произойдет.
при увеличение количества операция взятия хеша, число возможных коллизий увеличиваеться в геометрической прогрессии
Возможно, надо будет почитать про MD5(UNIX) подробней. Существенных проблем с коллизиями там нет.
А объясните мне, чем плох дабл md5 с солью по вкусу? Даже если ][ будет знать соль, то брутить 32 - х символьный хэш он будет ооочень долго... а потом еще раз...
А никто не будет брутить 32х символьный хеш.
Читайте выше - тот-же PasswordPro поддерживает произвольные хэш-модули, т.е. брутить будут сразу md5(md5($pass).$salt) а не последовательно.
Скорость брута по сравнению с обычным md5 будет отличаться незначительно
guest3297
29.02.2008, 16:18
Чем больше данных, шифруется тем больше возможность колизий, но тут есть свои подводные камни, для мд5 уже давно есть много софта для генерации коллизий, ну там надо знать исходный вариант до шифрования, иначе это превратиться опять же в банальный брут форс.
Возможно, надо будет почитать про MD5(UNIX) подробней. Существенных проблем с коллизиями там нет.
Проблеммы там такие же как и md5, за небольшой разницой в шифре.
}{0TT@БЬ)Ч
29.02.2008, 16:43
мдя во дела то какие,ставим пасс потяжелей и усе)))))))))))))))
astrologer
29.02.2008, 16:50
Вообще-то, md5(UNIX), насколько мне известно, вовсе не хеширует ничего тысячу раз.
Этот алгоритм только добавляет три рандомных цифры к строке и хеширует один раз. Просто для проверки хеша приходится перебрать 1000 вариантов. Это происходит за доли секунды, зато если пытаться брутить, возникают проблемы.
По-моему, способ вполне имеет право на существование.
бля md5 и фсе!
А вообще лучше позаботьтесь о защите ваших скриптов, чтобы не думать о криптовании пасса...
А вообще хватит и половины от md5 - 16 символов =\
.:EnoT:.
29.02.2008, 18:49
ребят вы чего? тема помоему называется не "А много ли существует методов хеширования?"...так зачем писать типо да таких методов навалом, тема бред, кг\ам и подобное? Если много то выкладывайте, ещё раз повторюсь, мне интересно стало, насколько можно составить сложную функцию хеширования. И это не только из-за движка, просто интересно.....более того исходный код никто не увидит, т.к. не паблик))
пока из всего вышеперечисленного могу отдать должное функции Macro, действительно интересно и необычно :)
мдя... насмешил, ты думай, а потом пиши
Хм... Если не знать исходников, то принцип md5(md5($pass).$salt) будет намного дадежнее простого md5($pass.$salt).
А вот если имеются исходники, то под любую криптографию (кроме той, где соль выводится умным рандомом, который заносится куданить в бд, являясь индивидуальной солью для определенного пароля) можно сделать свой брутфорс.
Хотя если хэш делается 0.5 - 1 секунду, то брут под него делать уже бессмысленно.
предлагаю сделать небрутабельный алго, чтобы при установке движка админ выбирал комбинацию алгоритмов и солей.
Онотолей, тогда смысл изобретать велосипед? при таком раскладе и md5(md5($pass).$salt) будет довольно таки секурным, т.к. хенкер незнает алгоритма шифрования, т.е. он врядли догадается что там таким образом пароль хешируется
Онотолей, тогда смысл изобретать велосипед? при таком раскладе и md5(md5($pass).$salt) будет довольно таки секурным, т.к. хенкер незнает алгоритма шифрования, т.е. он врядли догадается что там таким образом пароль хешируется
А что мешает хацкеру проверить популярные способы хеширования ? Если движок поддерживает регистрации - регистрируем аккаунт, пароль нам извествен, в базе видим хеш и скорее всего салт.
Затем тупо проверяем перебором все "стандартные" методы
дык я не говорю про популярные способы, я просто пример привел, ну сделай ты sha1(md5(pass)) я говорю впринципе... нет смысла "изобретния", т.к. вариантов куча...
еще раз говорю, не стоит путать яичницу с Божьим даром
двойной,тройной хоть сто тысячный md5() ничего вам не даст,т.к можно всегда будет пробрутить пасс
while i<1000000 do begin
if '5a4948a894009488a8a9048adbd'=md5(md5(i)) then MessageBox(0,'Лох!',0,0);
end;
двойной,тройной хоть сто тысячный md5() ничего вам не даст,т.к можно всегда будет пробрутить пасс
while i<1000000 do begin
if '5a4948a894009488a8a9048adbd'=md5(md5(i)) then MessageBox(0,'Лох!',0,0);
end;
Вы в этом примере рассчитываете на коллизию? 0_о. Тогда искренне желаю вам удачи. (док не забудьте добавить ноликов к условию ; ) )
А стотысячный md5 будет генерироваться довольно долго, поэтому брут для него будет делать только "брут-извращенец".
astrologer
29.02.2008, 20:59
двойной,тройной хоть сто тысячный md5() ничего вам не даст,т.к можно всегда будет пробрутить пасс
while i<1000000 do begin
if '5a4948a894009488a8a9048adbd'=md5(md5(i)) then MessageBox(0,'Лох!',0,0);
end;это миллион раз посчитает двойной md5() от i
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot