Wlasny ssl |
Wlasny ssl |
5.12.2003, 17:12:36
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 -------------------- Jeśli życie to kara to nieźle nabroiłem ;-)
|
|
|
5.12.2003, 19:52:36
Post
#2
|
|
Grupa: Zarejestrowani Postów: 691 Pomógł: 0 Dołączył: 6.08.2003 Ostrzeżenie: (0%) |
http://forum.php.pl/viewtopic.php?p=48068#48068
Może to Cię zadowoli. |
|
|
5.12.2003, 21:05:35
Post
#3
|
|
Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) |
calkiem ciekawe, dziekuje, narazie mi to wystarczy ale gdyby ktos mial inne pomysly to czekam na sugeste:)
-------------------- Jeśli życie to kara to nieźle nabroiłem ;-)
|
|
|
3.01.2004, 22:58:34
Post
#4
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 31.12.2003 Ostrzeżenie: (0%) |
Nie wiem czy rozumiem, ale gdybyś do zakodowanej informacji nie dodawał czasu z sekundami, to chyba "natychmiast" może trwac i 10 sek.
pozdrawiam Pat |
|
|
8.01.2004, 22:18:41
Post
#5
|
|
Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) |
jesli zrezygnuje z dodawania czasu to spadnie bezpieczenstwo tego rozwiazania
-------------------- Jeśli życie to kara to nieźle nabroiłem ;-)
|
|
|
8.01.2004, 22:38:26
Post
#6
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 19.11.2003 Skąd: Poznań Ostrzeżenie: (0%) |
Nie wiem czy ktoś to proponował, ale co myślicie o takim scenariuszu:
1. W sesji tworzony jest unikalna zmienna, która która występuje w formularzu jako hidden nazwijmy ją podobnie jak w przykładzie SEED 2. Przy submicie liczone: MD5(SEED+MD5(haslo)) i to jest wysyłane jako hasło 3. Serwer przechowuje w bazie hasła 'pociągnięte' MD5 - administrator nie widzi jawnych haseł - po to jest te wewnętrzne MD5 i serwer porównuje MD5(SEED+hasło w bazie) z tym co przyszło z przeglądarki 4. Jeśli jest OK autoryzacja idzie dalej - warto też zmienić wtedy identyfikator sesji. TO tak na szybko. Spełnia to podstawowe warunki: 1. hasło na serwerze nie jest jawne 2. przesyłane hasło nie jest jawne 3. Nie da się podsłuchać transmisji HTTP i wygenerować stronę z podsłuchanym SEED-em, jest on unikalny bo generuje go serwer a nie przeglądarka - taką wadę ma podawany przykład. Jeśli gdzieś popełniam błąd poprawcie mnie. -------------------- Enceladus
Warsztat: bez warsztatu Aktua |
|
|
8.01.2004, 22:45:51
Post
#7
|
|
Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) |
na pierwszy rzut oka pomysl niezly ale mam jedno 'ale', zmienna seed z pola hidden trzeba wyslac do przegladarki, mozna to podsluchac, jaki jest wiec sens jej wykozystania?
-------------------- Jeśli życie to kara to nieźle nabroiłem ;-)
|
|
|
8.01.2004, 23:07:33
Post
#8
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 19.11.2003 Skąd: Poznań Ostrzeżenie: (0%) |
Cytat na pierwszy rzut oka pomysl niezly ale mam jedno 'ale', zmienna seed z pola hidden trzeba wyslac do przegladarki, mozna to podsluchac, jaki jest wiec sens jej wykozystania?
Taki że generuje ją serwer a nie przeglądarka i za każdym razem jest inna (jest unikalna per sesja). Dzięki temu odpada scenariusz gdy atakujący "podsłucha" dane wysyłane podczas SUBMITA formularza, a potem sam zrobi dokładnie taki sam SUBMIT. Gdy SEED generowany jest po stronie przeglądarki mamy 'kupę' koleś wejdzie. Natomiast gdy SEED był z serwera, nawet gdy gość wyśle takie same dane SEED nie będzie poprawny - serwer go nie zaloguje. -------------------- Enceladus
Warsztat: bez warsztatu Aktua |
|
|
8.01.2004, 23:36:23
Post
#9
|
|
Grupa: Zarejestrowani Postów: 691 Pomógł: 0 Dołączył: 6.08.2003 Ostrzeżenie: (0%) |
Cytat 1. hasło na serwerze nie jest jawne
Ale to nic nie zmienia. Po prostu teraz żeby się zalogować nie trzeba znać hasła tylko jego skrót MD5, a do takowego ma administrator już dostęp. Jeśli to hasło chroni tylko ten serwis, to nie ma różnicy. Ewentualny pożytek jest wtedy gdy z tej samej bazy haseł autoryzują się inne usługi. Cytat 3. Nie da się podsłuchać transmisji HTTP i wygenerować stronę z podsłuchanym SEED-em, jest on unikalny bo generuje go serwer a nie przeglądarka - taką wadę ma podawany przykład.
Który przykład? Mój? (Bo nie widzę tu nigdzie indziej zmiennej o tej nazwie.) W moim również seed był generowany po stronie serwera. Generowanie go po stronie przeglądarki nic nie daje. |
|
|
8.01.2004, 23:50:10
Post
#10
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 19.11.2003 Skąd: Poznań Ostrzeżenie: (0%) |
Cytat Cytat 1. hasło na serwerze nie jest jawne
Ale to nic nie zmienia. Po prostu teraz żeby się zalogować nie trzeba znać hasła tylko jego skrót MD5, a do takowego ma administrator już dostęp. Jeśli to hasło chroni tylko ten serwis, to nie ma różnicy. Ewentualny pożytek jest wtedy gdy z tej samej bazy haseł autoryzują się inne usługi. Zmienia i to dużo - kłania się ludzkie lenistwo - ludzie zwykle mają takie samo hasło do kilku usług - jeśli w bazie zapisane są jawnie może się okazać, że nieuczciwy admin ma dostęp do zupełnie innych usług osób które ma w bazie. Przy okazji podważyłeś np. szyfrowanie haseł w systemie operacyjnym daj przykład usera, który ucieszy się gdy się dowie, że jego hasło na unixie jest jawnie zapisane w pliku shadow (tylko admin ma do niego dostęp) Cytat Który przykład? Mój? (Bo nie widzę tu nigdzie indziej zmiennej o tej nazwie.) W moim również seed był generowany po stronie serwera. Generowanie go po stronie przeglądarki nic nie daje.
Nie wskazałem - ten podany linkiem (Twój) - Squid chyba wiedział o co chodzi. Nic nie dało że generowałeś go na serwerze - logicznie to był jak generowany po stronie przeglądarki - do porównania było brane to co przyszło z przeglądarki $_POST['seed'] czy każdy mógł to podmienić. -------------------- Enceladus
Warsztat: bez warsztatu Aktua |
|
|
9.01.2004, 00:08:21
Post
#11
|
|
Grupa: Zarejestrowani Postów: 691 Pomógł: 0 Dołączył: 6.08.2003 Ostrzeżenie: (0%) |
Cytat Zmienia i to dużo - kłania się ludzkie lenistwo - ludzie zwykle mają takie samo hasło do kilku usług - jeśli w bazie zapisane są jawnie może się okazać, że nieuczciwy admin ma dostęp do zupełnie innych usług osób które ma w bazie.
Czytaj dokładnie to co napisałem. Cytat Jeśli to hasło chroni tylko ten serwis, to nie ma różnicy
Jeśli ktoś używa w kilku miejscach tego samego hasła to ten warunek z mojego zdania nie zachodzi. Cytat Przy okazji podważyłeś np. szyfrowanie haseł w systemie operacyjnym daj przykład usera, który ucieszy się gdy się dowie, że jego hasło na unixie jest jawnie zapisane w pliku shadow (tylko admin ma do niego dostęp)
Nie podważyłem. Nadinterpretowywujesz moje stwierdzenia. Poza tym większość uzytkowników nie ma pojęcia co daje hasło zapisane jawnym tekstem, a co zaszyfrowane/zakodowane. Będą powtarzać, że szyfrowane jest lepsze bo takie zdanie ma ich kolega który jest lokalnym znawcą tematu albo przeczytali to na jakimś forum, a sami nie bedą w stanie podać konkretnego przypadku w którym takowy format haseł ma przewagę. Cytat Nie wskazałem - ten podany linkiem - Squid chyba wiedział o co chodzi.
Jest to mój przykład i nie widzę na jakiej podstawie twierdzisz, że generuje on seed po stronie przeglądarki. |
|
|
9.01.2004, 00:09:18
Post
#12
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 19.11.2003 Skąd: Poznań Ostrzeżenie: (0%) |
Cytat Cytat Zmienia i to dużo - kłania się ludzkie lenistwo - ludzie zwykle mają takie samo hasło do kilku usług - jeśli w bazie zapisane są jawnie może się okazać, że nieuczciwy admin ma dostęp do zupełnie innych usług osób które ma w bazie.
Czytaj dokładnie to co napisałem. Cytat Jeśli to hasło chroni tylko ten serwis, to nie ma różnicy
Jeśli ktoś używa w kilku miejscach tego samego hasła to ten warunek z mojego zdania nie zachodzi. Cytat Przy okazji podważyłeś np. szyfrowanie haseł w systemie operacyjnym daj przykład usera, który ucieszy się gdy się dowie, że jego hasło na unixie jest jawnie zapisane w pliku shadow (tylko admin ma do niego dostęp)
Nie podważyłem. Nadinterpretowywujesz moje stwierdzenia. Poza tym większość uzytkowników nie ma pojęcia co daje hasło zapisane jawnym tekstem, a co zaszyfrowane/zakodowane. Będą powtarzać, że szyfrowane jest lepsze bo takie zdanie ma ich kolega który jest lokalnym znawcą tematu albo przeczytali to na jakimś forum, a sami nie bedą w stanie podać konkretnego przypadku w którym takowy format haseł ma przewagę. Cytat Nie wskazałem - ten podany linkiem - Squid chyba wiedział o co chodzi.
Jest to mój przykład i nie widzę na jakiej podstawie twierdzisz, że generuje on seed po stronie przeglądarki. Poprawiłe post-a ... ponadto ja wychodze z zalozenia ze jesli mogę coś zrobić dobrze to tak to robię - bardziej zabezpieczam dane userów. NIGDY nie zakładam że szaraczek ma pojęcie o bezpieczeństwie. -------------------- Enceladus
Warsztat: bez warsztatu Aktua |
|
|
9.01.2004, 00:27:17
Post
#13
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 19.11.2003 Skąd: Poznań Ostrzeżenie: (0%) |
Cytat Jest to mój przykład i nie widzę na jakiej podstawie twierdzisz, że generuje on seed po stronie przeglądarki.
Poniżej przykład 'ataku' na Twoją metodę: Dane wejściwe - hasło: 1234 Metoda: 1. Wyświetla się strona logowania SEED równy jest np: f96b697d7cb7938d525a2f31aaf161d0 2. Człowiek wprowadza hasło i robi submit liczone jest nowe hasło: MD5('1234f96b697d7cb7938d525a2f31aaf161d0') = '956009f105178ce233584bf15b152523' 3. Do przeglądarki wysyłane jest w post: $_POST['haslo']='956009f105178ce233584bf15b152523' $_POST['seed']='f96b697d7cb7938d525a2f31aaf161d0' ---- Ta transmisja zostaje przechwycona ----- 4. User skutecznie loguje się zgodnie z procedurą: [php:1:d6fb6645a6]<?php if (md5($haslo_wyciagniete_z_bazy . $_POST['seed']) == $_POST['haslo']) { # hasło poprawne } else { # haslo błędne } ?>[/php:1:d6fb6645a6] 5. Atakujący przerabia stronę logowania, wstawia na stałe wartości które przechwycił 6. Robi submit 7. BINGO - jest zalogowany -------------------- Enceladus
Warsztat: bez warsztatu Aktua |
|
|
9.01.2004, 00:43:08
Post
#14
|
|
Grupa: Zarejestrowani Postów: 691 Pomógł: 0 Dołączył: 6.08.2003 Ostrzeżenie: (0%) |
Przyjrzałem się teraz temu kodowi i faktycznie nie ma w nim sprawdzania poprawności seeda. Gdzie mi to zginęło? -- nie wiem.
W każdym bądź razie dzięki za zauważenie. Nie oglądałem tego mojego przykładu podczas dyskusji z Tobą, tylko pamiętałem samą metodę i myślałem, że masz do niej uwagi. Niestety była rozbieżność między algorytmem a implementacją. Oryginalny mój post poprawiłem, aby inni kopiując go jeden do jeden nie wpadli w pułapkę. |
|
|
9.01.2004, 00:57:24
Post
#15
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 19.11.2003 Skąd: Poznań Ostrzeżenie: (0%) |
Cytat Przyjrzałem się teraz temu kodowi i faktycznie nie ma w nim sprawdzania poprawności seeda. Gdzie mi to zginęło? -- nie wiem.
W każdym bądź razie dzięki za zauważenie. Nie oglądałem tego mojego przykładu podczas dyskusji z Tobą, tylko pamiętałem samą metodę i myślałem, że masz do niej uwagi. Niestety była rozbieżność między algorytmem a implementacją. Oryginalny mój post poprawiłem, aby inni kopiując go jeden do jeden nie wpadli w pułapkę. Spoko Inna sprawa, że te metody i tak są podatne na atak Man In The Middle. Wystarczy że ktoś sprytny i zdesperowany podszyje się pod nasz serwer, zrobi identyczną stronę logowania, ale taką która w JS-ie nie czyści pola formularza z właściwym hasłem i odbierze taką transmisję będzie miał czyste hasło. Wniosek jest taki - nie ma bezpiecznych metod - są tylko metody ograniczania ryzyka Dobrą metodą ograniczenia ryzyka jest stosowanie SSL-a - inna sprawa, że któraś z wersji MS IE była podatna na SSL-owy ataka typu MIM -------------------- Enceladus
Warsztat: bez warsztatu Aktua |
|
|
11.01.2004, 23:00:37
Post
#16
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 11.01.2004 Skąd: Gdynia Ostrzeżenie: (0%) |
Cytat 5. Atakujący przerabia stronę logowania, wstawia na stałe wartości które przechwycił
6. Robi submit 7. BINGO - jest zalogowany Warto generować MD5 nie tylko w oparciu o hasło, ale i adres IP klienta oraz oryginalny adres IP jeśli klient korzysta z proxy. Wówczas zdobyte, zakodowane dane będą mogły być wykorzystane tylko przez osobę z dokładnie takim samym adresem IP. -------------------- Michał Jaskólski
A1 Internet // inżynierowie infostrady // http://www.a1.pl :: płatne wsparcie techniczne dla PHP, MySQL i Apache |
|
|
11.01.2004, 23:16:00
Post
#17
|
|
Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) |
pod warunkiem ze ip sie nie zmieni czyli mowimy tu o przypadku kiedy kijent zalatwia wszystko w jednej sesji
-------------------- Jeśli życie to kara to nieźle nabroiłem ;-)
|
|
|
11.01.2004, 23:24:38
Post
#18
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 19.11.2003 Skąd: Poznań Ostrzeżenie: (0%) |
Cytat Warto generować MD5 nie tylko w oparciu o hasło, ale i adres IP klienta oraz oryginalny adres IP jeśli klient korzysta z proxy. Wówczas zdobyte, zakodowane dane będą mogły być wykorzystane tylko przez osobę z dokładnie takim samym adresem IP.
Które MD5 - bo nie bardzo rozumiem ? 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. -------------------- Enceladus
Warsztat: bez warsztatu Aktua |
|
|
12.01.2004, 02:38:06
Post
#19
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 11.01.2004 Skąd: Gdynia Ostrzeżenie: (0%) |
Cytat pod warunkiem ze ip sie nie zmieni czyli mowimy tu o przypadku kiedy kijent zalatwia wszystko w jednej sesji
No tak, w przypadku zmiany IP nie zgadzałyby się dane zakodowane MD5 i użytkownik musiałby zalogować się ponownie. -------------------- Michał Jaskólski
A1 Internet // inżynierowie infostrady // http://www.a1.pl :: płatne wsparcie techniczne dla PHP, MySQL i Apache |
|
|
12.01.2004, 02:51:04
Post
#20
|
|
Grupa: Zarejestrowani Postów: 270 Pomógł: 0 Dołączył: 15.06.2003 Ostrzeżenie: (0%) |
Ja chcąc zebezpieczyć kod wziąłem sie za sesje.
ID sesji zawiera 2 zmienne id i klucz. Gdzis na forum było o tym ale niestety nie mogłem znależć. Każde wejście powoduje wygenerowanie kolejnego klucza. Wejście z błędnym kluczem niszczy sesje i tworzy nową. Utrudnia to przejęcie sesji. [php:1:e935c83e2d]<?php class session { var $sesid; var $klucz; var $new_klucz; function read( $id ) { $key=$this->decode($id); if($key==false){ //echo"newkey"; $id=$this->new_sid(); $this->sesid=$id; $new_id=$this->code($id,$this->gen_klucz()); session_id($new_id); $key=$this->decode(session_id()); }else{ $this->sesid=$key['0']; } $this->klucz=$key['1']; $this->new_klucz=$this->gen_klucz(); $new_id=$this->code($this->sesid,$this->new_klucz); session_id($new_id); $query="SELECT * FROM " . $this->db['ss_table'] . " WHERE " . $this->db['id_field'] . " = '" . $this->sesid . "' AND " . $this->db['ex_field'] . " > '" . time() . "' AND ".$this->db['token_table']."='".$this->klucz."'"; $query = mysql_query($query); if ( mysql_num_rows( $query ) > 0 ) { $info = mysql_fetch_assoc( $query ); return( $info['DATA'] ); } else { $query="SELECT * FROM " . $this->db['ss_table'] . " WHERE " . $this->db['id_field'] . " = '" . $this->sesid . "'"; $query = mysql_query($query); if ( mysql_num_rows( $query ) > 0 ) { $id=$this->new_sid(); $key=$this->gen_klucz(); $new_id=$this->code($id,$key); session_id($new_id); $this->sesid=$id; $this->new_klucz=$key; } return( false ); } } function new_sid() { $_sid = substr(md5(uniqid(rand(), true)), 0, 32); return( $_sid ); } function decode($kod) { if (ereg('/^([a-zA-Z0-9]*)$/i', $kod)){ return false; } $odk = base64_decode($kod); $odkodowany=explode("|",$odk); if(count($odkodowany)!=2){ return false; } return $odkodowany; } function code($sesid,$klucz) { $key[0]=$sesid; $key[1]=$klucz; if(!isset($key[0]) && !isset($key[1])){ return false; } $zakod=implode("|",$key); $zakodowany=base64_encode($zakod); return $zakodowany; } function gen_klucz() { $klucz = substr(md5(uniqid(rand(), true)), 5, 5); return $klucz; } } ?>[/php:1:e935c83e2d] To jest niepełny kod reszta wyglada jak zwykła obsługa sesji przez mysql. |
|
|
Wersja Lo-Fi | Aktualny czas: 22.05.2024 - 04:14 |