![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) ![]() ![]() |
Witam!
w obliczu pewnego problemu (braku SSL) na darmowych serwerach wartoby pomyslec nad obejsciem tego problemu. Otoz mznaby za pomoca javascriptu generowac zhaszowany (md5) ciag zawierajacy login haslo itd. i porownywac go na serwerze z tam zhaszowanym. Tyleko jak do haszowania doda sie czas (dla wikszego bezpieczenstwa) to taki pakiet informacji musialby docierac do serwera natychmiast, wiec mazna to z kolei obejsc poprzez wygenerowanie na serwerze kilku(nastu) md5 i kilejno je porownujemy z tym co przegladarka wslala do serwera. Ale to tez daje wznoosc na kilka sekund i w dodatu obarcza serwer obliczeniami. plik index.php: [php:1:10ee9802fc]<?php <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Logowanie</title> <script type="text/javascript" src="login.js"></script> <script type="text/javascript"> var czas=<?php print(time()."rn")?> setInterval('czas++',1000) </script> </head> <body> <form onsubmit="return send(this.login.value, this.pwd.value, czas, 'frm')"> Login: <input type="text" name="login"><br> Hasło: <input type="password" name="pwd"><br> <input type="submit" value="Zaloguj"> </form> <form action="login.php" method="post" name="frm"> <input type="hidden" name="s"> </form> </body> </html> ?>[/php:1:10ee9802fc] plik login.php [php:1:10ee9802fc]<?php <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Logowanie</title> </head> <body> <?php // definiujemy poprawny login i hasło $login='test'; $haslo='xyz123'; // pobieramy aktualny znacznik czasu $czas=time(); // wykonujemy pętlę sprawdzającą poprawność przesłanej sumy MD5 for($i=0; $i<15; $i++){ if(md5($login.$haslo.($czas-$i)) == $_POST['s']){ print("Podany login i hasło są poprawne !");break; } } // jeżeli przesłana suma MD5 jest niepoprawna, wyświetlamy stosowną informację if($i==15)print("Brak autoryzacji !<br><a href='java script:history.go(-1)'>Spróbuj jeszcze raz</a>"); ?> </body> </html> ?>[/php:1:10ee9802fc] plik login.js Kod // SecureLogin 1.1 by Michal Grzechowiak (C) 2003
function y(n){var s='',h='0123456789abcdef',i=0 for(i;i<4;)s+=h.charAt((n>>(i*8+4))&15)+h.charAt((n>>(i++*8))&15);return s} function k(s){var l=s.length,n=((l+8)>>6)+1,b=[],i=0 for(i;i<n*16;)b[i++]=0;for(i=0;i<l;i++)b[i>>2]|=s.charCodeAt(i)<<((i%4)*8) b[i>>2]|=128<<((i%4)*8);b[n*16-2]=l*8;return b} function u(x,y){var l=(x&0xFFFF)+(y&0xFFFF),m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF)} function r(n,c){return (n<<c)|(n>>>(32-c))} function m(q,a,b,x,s,t){return u(r(u(u(a,q),u(x,t)),s),b)} function f(a,b,c,d,x,s,t){return m((b&c)|((~b)&d),a,b,x,s,t)} function g(a,b,c,d,x,s,t){return m((b&d)|(c&(~d)),a,b,x,s,t)} function h(a,b,c,d,x,s,t){return m(b^c^d,a,b,x,s,t)} function i(a,b,c,d,x,s,t){return m(c^(b|(~d)),a,b,x,s,t)} function md5(s){ var x=k(s),a=1732584193,b=-271733879,c=-1732584194,d=271733878,j,o for(j=0;j<x.length;j+=16){ o=[a,b,c,d] a=f(a,b,c,d,x[j+0],7,-680876936) d=f(d,a,b,c,x[j+1],12,-389564586) c=f(c,d,a,b,x[j+2],17,606105819) b=f(b,c,d,a,x[j+3],22,-1044525330) a=f(a,b,c,d,x[j+4],7,-176418897) d=f(d,a,b,c,x[j+5],12,1200080426) c=f(c,d,a,b,x[j+6],17,-1473231341) b=f(b,c,d,a,x[j+7],22,-45705983) a=f(a,b,c,d,x[j+8],7,1770035416) d=f(d,a,b,c,x[j+9],12,-1958414417) c=f(c,d,a,b,x[j+10],17,-42063) b=f(b,c,d,a,x[j+11],22,-1990404162) a=f(a,b,c,d,x[j+12],7,1804603682) d=f(d,a,b,c,x[j+13],12,-40341101) c=f(c,d,a,b,x[j+14],17,-1502002290) b=f(b,c,d,a,x[j+15],22,1236535329) a=g(a,b,c,d,x[j+1],5,-165796510) d=g(d,a,b,c,x[j+6],9,-1069501632) c=g(c,d,a,b,x[j+11],14,643717713) b=g(b,c,d,a,x[j+0],20,-373897302) a=g(a,b,c,d,x[j+5],5,-701558691) d=g(d,a,b,c,x[j+10],9,38016083) c=g(c,d,a,b,x[j+15],14,-660478335) b=g(b,c,d,a,x[j+4],20,-405537848) a=g(a,b,c,d,x[j+9],5,568446438) d=g(d,a,b,c,x[j+14],9,-1019803690) c=g(c,d,a,b,x[j+3],14,-187363961) b=g(b,c,d,a,x[j+8],20,1163531501) a=g(a,b,c,d,x[j+13],5,-1444681467) d=g(d,a,b,c,x[j+2],9,-51403784) c=g(c,d,a,b,x[j+7],14,1735328473) b=g(b,c,d,a,x[j+12],20,-1926607734) a=h(a,b,c,d,x[j+5],4,-378558) d=h(d,a,b,c,x[j+8],11,-2022574463) c=h(c,d,a,b,x[j+11],16,1839030562) b=h(b,c,d,a,x[j+14],23,-35309556) a=h(a,b,c,d,x[j+1],4,-1530992060) d=h(d,a,b,c,x[j+4],11,1272893353) c=h(c,d,a,b,x[j+7],16,-155497632) b=h(b,c,d,a,x[j+10],23,-1094730640) a=h(a,b,c,d,x[j+13],4,681279174) d=h(d,a,b,c,x[j+0],11,-358537222) c=h(c,d,a,b,x[j+3],16,-722521979) b=h(b,c,d,a,x[j+6],23,76029189) a=h(a,b,c,d,x[j+9],4,-640364487) d=h(d,a,b,c,x[j+12],11,-421815835) c=h(c,d,a,b,x[j+15],16,530742520) b=h(b,c,d,a,x[j+2],23,-995338651) a=i(a,b,c,d,x[j+0],6,-198630844) d=i(d,a,b,c,x[j+7],10,1126891415) c=i(c,d,a,b,x[j+14],15,-1416354905) b=i(b,c,d,a,x[j+5],21,-57434055) a=i(a,b,c,d,x[j+12],6,1700485571) d=i(d,a,b,c,x[j+3],10,-1894986606) c=i(c,d,a,b,x[j+10],15,-1051523) b=i(b,c,d,a,x[j+1],21,-2054922799) a=i(a,b,c,d,x[j+8],6,1873313359) d=i(d,a,b,c,x[j+15],10,-30611744) c=i(c,d,a,b,x[j+6],15,-1560198380) b=i(b,c,d,a,x[j+13],21,1309151649) a=i(a,b,c,d,x[j+4],6,-145523070) d=i(d,a,b,c,x[j+11],10,-1120210379) c=i(c,d,a,b,x[j+2],15,718787259) b=i(b,c,d,a,x[j+9],21,-343485551) a=u(a,o[0]);b=u(b,o[1]);c=u(c,o[2]);d=u(d,o[3])}return y(a)+y(b)+y(c)+y(d)} function send(q,w,x,v){with(document.forms[v])s.value=md5(q+w+x),submit();return!1} Moje pytanie czy jest jakis sposob by ominac te niedogodnosc generowania wielu md5 na serwerze |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 11.01.2004 Skąd: Gdynia Ostrzeżenie: (0%) ![]() ![]() |
Cytat Które MD5 - bo nie bardzo rozumiem (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?
Adres IP jest jednoznaczny, atakujący może przeprowadzić analizę takiego algorytmu i opracowac atak na ten algorytm. Wszędzie gdzie mowa o szyfrowaniu, zawsze _NAJWAŻNIEJSZE_ są liczby losowe, na nich oparte są te algorytmy. Nie da się opierać algorytmów mających zapewniać bezpieczeństwo na danych które można przewidzieć, to niszczy algorytm u samych podstaw. Wątek dotyczył tego, jak dokonać autoryzacji po HTTP bez SSL nie przesyłając hasła przy każdym logowaniu. Można tego dokonać w następujący sposób: [list] [*]skrypt wypluwa formularz, w którym znajduje się pole na wpisanie loginu, hasła, a w polu typu hidden umieszcza adres IP użytkownika (z poprawką na firewall/proxy) [*]klient wpisuje login oraz hasło i wysyła formularz [*]uaktywnia się kod javascript w przeglądarce użytkownika, który generuje ciąg znaków w oparciu o hasło i adres IP używając MD5 i przesyła na serwer ów ciąg znaków zamiast hasła [*]skrypt dostaje login użytkownika oraz nasz ciąg znaków [*]skrypt sprawdza adres IP użytkownika, czyta z bazy jego hasło (wg. loginu) i w oparciu o te dane również generuje ciąg znaków używając MD5 [*]teraz skrypt może porównać oba ciągi znaków - jeśli są identyczne, to użytkownik podał prawidłowe hasło i można dać mu odpowiednie uprawnienia [*]jeśli włamywacz przechwyci ciąg znaków zakodowany MD5 i login, to nic nie zdziała, bowiem ciąg znaków wygenerowany po stronie serwera będzie inny ze względu na inny adres IP włamywacza [*]jeśli włamywacz będzie chciał sam wygenerować ciąg znaków, to też nic nie zdziała, bowiem musiałby znać hasło użytkownika [list] Rozwiązanie nie jest oczywiście w 100% niezawodne. W końcu użytkownik z włamywaczem mogą korzystać z tego samego firewalla lub serwera proxy z wyłączoną funkcją transmisji wewnętrznych adresów IP. Przy wyłączonym Javascripcie logowanie też zadziała, ale hasło pofrunie otwartym tekstem. Warto jednak pamiętać, że SSL umożliwia nie tylko kodowanie transmisji, ale także weryfikację czy dany serwis jest rzeczywiście tym serwisem, za który się podaje. Bez SSL łatwo wprowadzić użytkownika w błąd, na przykład z pomocą wykrytego niedawno błędu w Internet Explorerze. Nie rozumiem jednak co mają do tego liczby losowe i w jaki sposób ich brak niszczy ten algorytm :? |
|
|
![]() ![]() |
![]() |
Aktualny czas: 9.10.2025 - 13:18 |