Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wlasny ssl
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
squid
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
adwol
http://forum.php.pl/viewtopic.php?p=48068#48068
Może to Cię zadowoli.
squid
calkiem ciekawe, dziekuje, narazie mi to wystarczy ale gdyby ktos mial inne pomysly to czekam na sugeste:)
pat_
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
squid
jesli zrezygnuje z dodawania czasu to spadnie bezpieczenstwo tego rozwiazania
enceladus
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.
squid
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?
enceladus
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.
adwol
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.
enceladus
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 smile.gif 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ć.
adwol
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 smile.gif 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.
enceladus
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 smile.gif 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
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
adwol
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ą. winksmiley.jpg

Oryginalny mój post poprawiłem, aby inni kopiując go jeden do jeden nie wpadli w pułapkę.
enceladus
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ą. winksmiley.jpg

Oryginalny mój post poprawiłem, aby inni kopiując go jeden do jeden nie wpadli w pułapkę.

Spoko smile.gif
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 smile.gif 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 smile.gif
a1internet
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.
squid
pod warunkiem ze ip sie nie zmieni czyli mowimy tu o przypadku kiedy kijent zalatwia wszystko w jednej sesji
enceladus
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 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.
a1internet
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.
Bora
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.
a1internet
Cytat
Które MD5 - bo nie bardzo rozumiem 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 :?
Bora
Cytat
Wątek dotyczył tego, jak dokonać autoryzacji po HTTP bez SSL nie przesyłając hasła przy każdym logowaniu.  

Wystarczy w bazie zapisywać ostatnie zakodowane sesje (seja+klucz) i u użytkownika.
Po wejściu na strone moźna odrazu zidentyfikować co to za użytkownik i kiedy zakończył i gdzie.
Jedyny sposób przejęcia to zdobycie ciasteczka z sesją i niewykorzystanym kluczem albo na drodze serwer -> przeglądarka.
Każde przejęcie w 2 strone nic nie da.
enceladus
Cytat
Wątek dotyczył tego, jak dokonać autoryzacji po HTTP bez SSL nie przesyłając hasła przy każdym logowaniu.  

Zgadza się sam taki algorytm przedstawiłem smile.gif
Cytat
[*]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

Pamiętaj że zna funkcję przy pomocy której zaciemniany jest ciąg (jak sam piszesz jest w JS), zna też dane wejściowe (hasło i obecność jego własnego IP w formularzu jest jednoznaczna). Ja po przeanalizowaniu takiego algorytmu i posiadaniu danych testowych (np. z podsłuchu) zabrałbym się za złamanie hasła metodą brutal force, podstawiając kolejne hasła do algorytmu obliczającego MD5 z IP i hasła. Zauważ, że wystarczy mieć podsłuchane dane przesyłane w relacji klient -> serwer. W mojej wersji z liczbą losową przesyłaną z serwera do klienta atakujący ma ciut trudniej bo musi najpier podsłuchać transmisję serwer -> klient a potem odpowiadającą jej klient -> serwer (jeśli zmienna losowa zostanie usunięta z formularza, bo jeśli będzie w formularzu to wystarczy tylko 2-gi etap). Mając te dane też może przeprowadzić atak brutal force. Jedyny zysk jest taki, że nie ułatwia im się życia smile.gif
W wersji z IP atakujący może jeszcze ustawić świadomie takie samo IP jak ofiara i wtedy wystarczy że wyśle takiego samego POST-a z formularza. (o tym pisałeś). Nie potrzebuje wtedy nawet brutal force.
Cytat
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.

Z SSL-em też swego czasu dało się przeprowadzić atak MiM na IE.
Cytat
Nie rozumiem jednak co mają do tego liczby losowe i w jaki sposób ich brak niszczy ten algorytm :?

PIsałem to w nocy - miałem na myśli osłabia.
Bora
mój poprzedni komentarz pisałem w nocy i choziło poprostu o to że skoro nie ma ssl to chciałem zacząć zabezpieczanie kodu od poprawienia sesji.
Jaka jest wasza opinia o moim kodizie questionmark.gif?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.