Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
1ST_NOT_EQ---3973032722---8
ALL_EQUAL----3973032736---8
1ST_NOT_EQ---3973032750---7
ALL_EQUAL----3973032764---7
1ST_NOT_EQ---3973032777---8
ALL_EQUAL----3973032791---7
1ST_NOT_EQ---3973032804---7
ALL_EQUAL----3973032817---7
1ST_NOT_EQ---3973032831---7
ALL_EQUAL----3973032844---7
1ST_NOT_EQ---3973032858---7
ALL_EQUAL----3973032871---7
1ST_NOT_EQ---3973032884---7
ALL_EQUAL----3973032897---7
1ST_NOT_EQ---3973032911---6
ALL_EQUAL----3973032923---7
1ST_NOT_EQ---3973032937---7
ALL_EQUAL----3973032950---7
1ST_NOT_EQ---3973032963---7
ALL_EQUAL----3973032977---7
1ST_NOT_EQ---3973032990---7
ALL_EQUAL----3973033003---6
1ST_NOT_EQ---3973033016---7
ALL_EQUAL----3973033028---7
1ST_NOT_EQ---3973033042---6
ALL_EQUAL----3973033055---6
1ST_NOT_EQ---3973033068---7
ALL_EQUAL----3973033082---7
1ST_NOT_EQ---3973033095---7
ALL_EQUAL----3973033110---7
1ST_NOT_EQ---3973033123---7
ALL_EQUAL----3973033137---7
1ST_NOT_EQ---3973033151---8
ALL_EQUAL----3973033165---7
1ST_NOT_EQ---3973033178---7
ALL_EQUAL----3973033191---7
1ST_NOT_EQ---3973033205---7
ALL_EQUAL----3973033218---7
1ST_NOT_EQ---3973033231---7
ALL_EQUAL----3973033244---6
1ST_NOT_EQ---3973033257---6
ALL_EQUAL----3973033269---7
1ST_NOT_EQ---3973033282---7
ALL_EQUAL----3973033296---7
1ST_NOT_EQ---3973033309---7
ALL_EQUAL----3973033322---7
1ST_NOT_EQ---3973033336---6
ALL_EQUAL----3973033348---7
1ST_NOT_EQ---3973033362---7
ALL_EQUAL----3973033375---8
1ST_NOT_EQ---3973033389---28
ALL_EQUAL----3973033427---10
1ST_NOT_EQ---3973033445---8
ALL_EQUAL----3973033459---8
1ST_NOT_EQ---3973033473---8
ALL_EQUAL----3973033487---7
1ST_NOT_EQ---3973033501---7
ALL_EQUAL----3973033516---7
1ST_NOT_EQ---3973033530---7
ALL_EQUAL----3973033543---7
1ST_NOT_EQ---3973033556---7
ALL_EQUAL----3973033569---7
1ST_NOT_EQ---3973033582---7
ALL_EQUAL----3973033595---7
1ST_NOT_EQ---3973033608---7
ALL_EQUAL----3973033621---8
1ST_NOT_EQ---3973033635---7
ALL_EQUAL----3973033648---7
1ST_NOT_EQ---3973033661---7
ALL_EQUAL----3973033674---7
1ST_NOT_EQ---3973033687---7
ALL_EQUAL----3973033700---7
1ST_NOT_EQ---3973033714---6
ALL_EQUAL----3973033727---7
1ST_NOT_EQ---3973033740---7
ALL_EQUAL----3973033753---6
1ST_NOT_EQ---3973033766---7
ALL_EQUAL----3973033779---6
1ST_NOT_EQ---3973033792---7
ALL_EQUAL----3973033804---7
1ST_NOT_EQ---3973033818---7
ALL_EQUAL----3973033831---7
1ST_NOT_EQ---3973033844---7
ALL_EQUAL----3973033857---7
1ST_NOT_EQ---3973033870---7
ALL_EQUAL----3973033883---7
1ST_NOT_EQ---3973033896---7
ALL_EQUAL----3973033910---7
1ST_NOT_EQ---3973033923---6
ALL_EQUAL----3973033936---7
1ST_NOT_EQ---3973033949---7
ALL_EQUAL----3973033962---7
1ST_NOT_EQ---3973033975---7
ALL_EQUAL----3973033988---7
1ST_NOT_EQ---3973034001---7
ALL_EQUAL----3973034014---7
1ST_NOT_EQ---3973034027---7
ALL_EQUAL----3973034040---7
Если вы знаете значение md5('foo'), в силу способа вычисления MD5 можно очень легко посчитать значение md5('foobar'), даже не зная префикса 'foo'.
site.com/?param=protected&sig=9bf4a1a22db9b764a36af4746864b847
sig = md5(key+protected). Я хочу получить:site.com/?param=hacked
site.com/?param=protected\x80\x00\x00...\x00\xNN¶m=hackedparams[:user_id] «из коробки»).Суть Length extension в том, что к сообщению добавляются новые байты. Заменить исходные не выйдет.
Т.е. в лучшем случае, у вас получится что-то вроде
site.com/?param=protected\x80\x00\x00...\x00\xNN¶m=hacked
MD5_CTX seed;
// оригинальный запрос к серверу:
// example.com/?msg=status:protected&sig=039f220db17cebe441bc4d34e6683963
MD5_Init(&seed);
// секрет + тело сообщения
char *msg = "900150983cd24fb0d6963d7d28e17f72" \
"status:protected";
printf("%s\n", md5(msg, strlen(msg), &seed));
// = 039f220db17cebe441bc4d34e6683963 - это и есть подпись для исходного сообщения
MD5_Init(&seed);
// та самая исходная подпись, порезанная на части
seed.A = 0x0d229f03;
seed.B = 0xe4eb7cb1;
seed.C = 0x344dbc41;
seed.D = 0x633968e6;
// длина исходного сообщения с секретом в битах, округлённая вверх до кратного 512 значения
seed.Nl = 512;
seed.Nh = 0;
// вычисляем новый хэш (= подпись), исходя из начального значения и нашей "добавки"
char *extension = ",status:hacked";
printf("%s\n", md5(extension, strlen(extension), &seed));
// = 164bc99c345fd21e1e810bf9a41222b
// подделанный запрос к серверу:
// example.com/?msg=status:protected%80%00%00%00%00%00%00%00%80%01%00%00%00%00%00%00,status:hacked&sig=164bc99c345fd21e1e810bf9a41222b
// а вот так будет считать хэш сервер
// я специально порезал строку на части, чтобы лучше была видна структура:
// секрет, исходное сообщение, паддинг, длина исходного сообщения с секретом, "добавка"
MD5_Init(&seed);
char *msg2 = "900150983cd24fb0d6963d7d28e17f72" \
"status:protected" \
"\x80\x00\x00\x00\x00\x00\x00\x00" \
"\x80\x01\x00\x00\x00\x00\x00\x00" \
",status:hacked";
printf("%s\n", md5(msg2, 78, &seed)); // strlen() тут не сработает - потому 78
// = 164bc99c345fd21e1e810bf9a41222b - наша подпись подошла!
Против атаки по времени зачем делать xor, если можно сделать sleep на случайное число миллисекунд?
Для сравнения строк мы можем воспользоваться тем фактом, что XOR любого байта с самим собой даст 0. Всё, что нам надо сделать — применить операцию XOR к каждой паре соответствующих байтов из строк A и B, сложить получившиеся результаты и вернуть true, если сумма равна 0, и false в противном случае.
Подпись — это MD5 от строки, состоящей из общего секрета и добавленных за ним следом пар ключ-значение.
MD5(key | message) был вполне себе «паттерном». Примеры Flickr, Vimeo и RTM нам на это как бы намекают.H(message | key) есть свои проблемы. В частности, поскольку message (а значит и его хэш) взломщику известен, он может найти такое сообщение message2, которое будет давать то же самое значение хэша: H(message) = H(message2). А значит и после приклеивания в конце ключа хэши будут совпадать. Т.е. подпись от message можно будет использовать для отправки message2.H(key | message | key) — лучше. Но и у него были обнаружены уязвимости, даже когда ключ-префикс и ключ-суффикс различаются.H(key1 | H(key2 | message)), где key1 и key2 особым образом получаются из исходного ключа.в 2006 году чешский криптограф Властимил Клима предложил для поиска коллизий новый метод, позволяющий найти разную пару случайных 128 байтных блоков с одной md5 суммой на персональном компьютере меньше чем за минуту
In April 2009, a preimage attack against MD5 was published that breaks MD5's preimage resistance. This attack is only theoretical, with a computational complexity of 2123.4 for full preimage.
H(message | key), о которой я писал выше?Конкретно от угрозы length extension это избавит. Но у варианта H(message | key) есть свои проблемы. ...
H(message | key):appending the key using MAC = H(message | key), suffers from the problem that an attacker who can find a collision in the (unkeyed) hash function has a collision in the MAC
H(key1 | H(key2 | message))посыл статьи… носит слегка рекламный оттенок («оставьте криптографию нам, экспертам»)
md5($mes. $this->o['secret_part2']. $this->id) заменить значение $mes на другое, имеющее такой же хэш, подпись по-прежнему будет валиднойH(key1 | H(key2 | message))Зайти и взять по http плейнтекстом — это одно (не наказуемо, «по понятиям»).
арендовать сервер в том же ДЦ и устроить гигантскую timing-атаку
Мы обычно к HMAC добавляем таймстемп. Во-первых защищает от отложенных атак (reply), во-вторых защищает от бесконечного брутфорса.
И часы синхронизируете по защищённому протоколу? Всё как положено?Мне кажется, что мы можем допустить рассинхронизацию часов между клиентом и сервером на некоторое количество минут m. Если клиентский timestamp вылезает за этот порог, то считаем его невалидным. Если не вылезает, то проверяем список HMAC запросов от этого клиента за последние 2m минут. Если нашли совпадение, то это replay-атака. Если не нашли, то можем выполнить запрос.
Вы опасно некомпетентны в криптографии