Проверка на md5 - еднакви hash

eddyy93

Registered
Може ли някой да направи един цикъл който автоматично числата от 1 до 100 000 се запишат в един масив като се записва тяхният md5 формат, а не самото число и после да се проверят дали има еднакви hash - ове.

Интересно ми е примерно ако hash на числото "1" което е "c4ca4238a0b923820dcc509a6f75849b"

Дали няма някъде от 2 - 100 000 същият hash.


-----

Също така да питам направо тук да не отворя нова тема.

Искам да предодвратя някой любопитко като напише в урл за $_GET някоя друга стойност да прецака нещо. За това на всички $_GET съм им задал md5
и заявките ми изглеждат така.

Код:
mysql_query("UPDATE table SET perm=2 WHERE md5(md5(id))='$topn'")
;

Искам да знам дали съм на прав път по този начин ..
 
Сметни пермутациите на 32 символа, да видиш колко много различни хеша могат да се получат.


Колкото до втория ти въпрос - според мен няма смисъл от тези неща. Просто си валидирай методите какви стойности могат да получават и така.
 
Отговор на първия ти въпрос: http://forums.devshed.com/security-and-cryptography-17/md5-number-from-1-to-1million-when-does-md5-repeat-359753.html

За да се предпазиш да не бъдеш хакнат, можеш да филтрираш променливите така:
1)ако променлива е от integer(например при странициране): $start = (int)$_GET['start']; - така каквото и да въведе ако не е число автоматично ще ве превърне в 0.
2)ако променливата е string: $var = htmlspecialchars(addslashes($_GET['var'])); -така филтрираш за знаци като <,>, кавички и др
 
Е то ако е md5 няма смисъл от (int) .. само цифри и букви ще е. Целта ми е ако някой напише в урл-то за $_GET друга стойност да не си прецака информацията. Примерно имам една $_GET['remove'] където трие качен от него файл. И ако смени горе на $_GET ще изтрие друго което той не желае и за това го прехвърлям към md5.
 
Ето.

Това е линка.

Код:
<a href="panel.php?remove=<?php echo md5($row['id']) ?>">Изтрий</a>

Това е проверка със заявката.

Код:
if(isset($_GET['remove'])){
    $remid=md5($_GET['remove']);
}


if(isset($remid)) {
    
    my_dbcon();
    $check_del=mysql_query("SELECT id,perm FROM table WHERE md5(md5(id))='$remid' AND perm=2");
    $checked_del=mysql_num_rows($check_del);
    mysql_close();
    if($checked_del>0) {
    $error['21']=true;
    }

    else {

            my_dbcon();
            mysql_query("DELETE FROM table WHERE md5(md5(id))='$remid'");
            mysql_close();
            header('Location: panel.php');
            exit;
      }
}
 
Това не му пречи да си хешира "2" и да подаде хешираното ID и да го изтрие. И няма смисъл да си хешираш колоните. Колоните си ги подавай нормално, но когато триеш прави проверка дали този файл, който ще изтрие е качен от него, или не е.
 
Той вече ако си hash "2" си е негов проблем .. аз съм се опитал да го защитя да не си навреди от неговото любопитсвто на неговите си работи ако тръгне разбира се да пише разни работи в УРЛ-то. Колкото до сайта не може да вкара код никъде в сайта тъй като той се hash - ва в md5 .. така си мисля аз.

А да hash "id" в заявката лошо ли е това?
 
Не е лошо, а безсмислено.

Той вече ако си hash "2" си е негов проблем .. аз съм се опитал да го защитя

Един програмист не трябва да мисли така. Бил си се опитал. Не е въпроса ти да се опиташ, а да направиш така, че реално да няма как да изтрие дадено ID.
Затова, няма смисъл да си хешираш каквото и да е. Просто проверявай дали дадения потребител е качил този файл и ако го е качил той, нека си го изтрие. Защото като ти гледам заявката, той ще подаде хеширано ID и така ще изтрие всички ID-та, които са съответното ID. И по този начин няма да изтрие само неговия файл, ами и всеки друг файл, който е качен примерно от друг потребител.
 
Трябва да работи, но мисля че само си усложняваш работата сам. Не виждам кой би седнал да човърка урл-то само, за да си навреди. Ако искаш си го остави така с md5-тата, но на твое място бих минал $_GET['remove'] само през (int) + един alert преди да изтрие даден файл. Така го информираш че ще направи нещо глупаво, а той вече да му мисли.
 
fenixpz говоря от личен опит. :D

Благодаря за отговорите.

Значи в крайна сметка да се появат 2 хеша от числата 1 до 100 000 000 има ли шанс ?
 
Няма никакъв шанс. Както казах, изчисли пермутациите на 32 символа и ще видиш какво число ще получиш. Сигурен съм, че и ти няма да знаеш как се нарича това число.
 
Добре пребройх го хеша на цифрата "1"

Ето го резултата:

Първата колконка са цифрите и буквите на хеша, а 2 рата са колко пъти се повтарят.

Сега някой да помогне по формулата.

c-4
4-3
a-3
2-3
3-2
8-2
0-3
b-3
9-3
d-1
5-2
6-1
f-1
7-1
 
Опитвам се да намеря колко комбинации може да има една мд5

Гледам от тази тема най-долу ги има формулите.
Намерих числителя който е " 3.1498840316134E+35 ", но знаменателя нещо се обърках как да го намеря.

И този числител как да го разложа на нормална цифра ..

http://www.math10.com/forumbg/viewtopic.php?t=9781
 
Аз до сега какво ти показвам :D Смяташ пермутациите. 32 пермутации с 36(аз съм показал с 26) знака и получаваш числото.
 

Back
Горе