To jest tylko wersja do druku, aby zobaczyć pełną wersję tematu, kliknij TUTAJ
phpBB2 by Przemo
Support forów phpBB2 modified by Przemo

Archiwum działu Ogólne (posty do 12.2007) - Ulepszenie kodowania hasel w bazie danych

Paszczak000 - 07-01-2006, 21:26

Przemo napisał/a:
istnieje funkcja odwrotna

ale do md5 nie ma funkcji odwrotnej tak jak rot13 czy base64. hashujesh raz a złamanie polega na domyśleniu się hasha co trwa długo

no, ale jak już pisałem. co z tego, że zabezpieczysz skrypt jak użyszkodnik będzie miał słabe hasło na GG. Wykradną tam...... wejdą tu. I po co było to zabezpieczenie? pfff.... Lepiej nauczyć go mieć trudne hasło. Racja?

a przmo jakie Ty masz hasło? 4 znakowe czy więcej? urzytwasz FTP? a tam hasło leci jawnym tekstem :P i na co to szyfrowanie :)

irekk - 07-01-2006, 21:31

Paszczak000, i jak sie z toba nie zgodzic ;)
Przemo - 07-01-2006, 21:36

Paszczak000, mówiąc o funkcji odwrotnej mialem na mysli nie funkcje ktora dekoduje tylko funkcje ustawione w odwrotnej kolejnosci i porownujace jedno haslo z milionem wygenerowanych.
Krakers - 07-01-2006, 21:58

Jeśli komuś zależy na bezpieczeństwie, to po prostu ustawia minimalną długość hasła na więcej liter. Opcja już jest dostępna.
przecinek - 07-01-2006, 22:03

To co wcześniej pisałem to rzeczywiście bzdury były:).
Przemo napisał/a:
Istnieje jedna wątpliwość mianowicie słowniki. Jeżeli admin chce złamac jedno hasło 4 znakowe musi stracic 27 godzin, wydawalo by sie ze aby odkodowac wszystki hasla 4 znakow z bazy np. 1000 userow potrzebowalby 27 godzin * 1000 lecz tak nie jest jesli wygeneruje sobie slownik co zajmie mu 27 godzin a potem porownywanie zakodowanych hasel zajmie kilka minuit.
To może tak:
Kod:
$pass=md5($table_prefix.$user_id.md5($pass));
for (i=0;i<ile_kodowan;i++):
 $pass=md5(pass);
endfor;
To powinno skutecznie uniemożliwić robienie słowników zarówno w obrębie forum, jak i globalnych dla danego id (jeśli będziemy dużymi literami w instalatorze sugerować, by wybrać unikalny prefiks).

irekk - 07-01-2006, 22:19

przecinek, a co jesli ktos sie loguje? wowczas musialbys wyciagnac id usera z bazy o podanym loginie a pozniej wykonac jeszcze jedno zapytanie by sprawdzic czy dany user ma to haslo. ale pomysl ogolnie najlepszy tylko bez $user_id
50k07 - 07-01-2006, 22:22

Witam. Moim skromnym zdaniem to jest tak:

1. Zachowanie wstecznej zgodności jest dla Was priorytetem no.1. Nie można tej regóły złamać, ponieważ łączyłoby się to z rozpoczęciem zupełnie innej działalności, odrębne forum, już nie PHPbb by Przemo tylko Przemo by PHPbb :)

2. Wsteczna zgodność jest ważna, jednak nie powinna stanowić jakiejkolwiek bariery dla osób modyfikujących cokolwiek. Znaczy to mniej więcej tyle, że jak sie robi coś dobrego od początku, to później nie będzie się miało problemów z ulepszaniem tego. Co innego jeśli od początku coś jest do d... Wtedy (patrzcie Microsoft i brak wstecznej zgodności Visty) trzeba zaczynać od początku. Tutaj mamy jednak do czynienia z pierwszym przypadkiem.

3. Już podczas czytania 1 strony wątku pomyślałem - nic prostszego - zrobić swoje kodowanie. OWSZEM - istnieć będzie funkcja odwrotna, ale CO Z TEGO.

Pokolei.
Wsteczną zgodność zyskujemy dzięki kodowaniu MD5. OK. Lubicie je i niech zostanie. Jednak jako modyfikacja, powinniście może coś ... zmodyfikować? Stosowanie >= 2x MD5 jest zgodzeniem się na brak wstecznej zgodności (chyba że deinstalator zajmować będzie tyle TB, ile tabelki Rainbow dla #MD5 32 char). Zasosowanie SHA albo innych cudów - zgodzeniem się na brak bezpieczeństwa (istnieją słowniki w Internecie) --> czyt. żadne wyjście nie jest w 100% dobre. Co zatem jest dobre? Trzeba ustalić kodowanie, napisane samemu, które obejmować będzie hasła składające się z 32 znaków (tyle ile w hashu), zamieniające je na coś co wygląda jak hash, a jednak nim nie jest. Powiecie że to trudne :) ? OK. Zgodze sie, tymbardziej, że znać musielibyście f(x) odwrotną (zachowanie zgodności, deinstalator modyfikacji by Przemo musiałby używać tej f(x) odwrotnej). Ludzie troche pomyśleli zanim zrobili kodowanie MD5 :) Jeszcze trudniej zrobić jest coś "w podobie". Dlaczego ma to wyglądać jak MD5 po przepuszczeniu przez ten własnej roboty młynek? ..Ano. Ludzie wogóle nie zauważą (łącznie może z moderatorami, właścicielami forów..?) że coś się zmieniło. Powiecie im tylko, że BARDZO zwiększona jest polityka bezpieczeństwa haseł, a instalatory (upgradery) forów zajmą się przetwarzaniem hashy na funkcja(hash('passwd')) Kiedy ktoś będzie próbował użyć Rainbow - zdziwi się :) . Deinstalator zamieniać będzie spowrotem f^(-1)(hash('passwd')) i nikt nic nie zauważy. Tylko BARDZO DOCIEKLIWI, że wartości "hashy" się pozmieniały.

A teraz kilka ważnych postulatów:

1. Przemo. Proszę Cię. Nie zchodź z drogi kompatybilności. To jedyna droga do sukcesu tak naprawde i ja w to wierze :) Zobacz ile ludzi stanie przed pytaniem "Przemo czy nie Przemo...". Zwróć uwagę ile osób odpowie Przemo.... 100% ? A po co ich tracić? Czysty marketing...

2.Technicznie. Funkcja którą napiszecie musi, MUSI być jakaś tajna, nie wiem, niech sie zabierze za to trójka osób. Normalnie jak oficerowie bezpieczeństwa. MUSI tak naprawde generować swoje produkty w oparciu o jeszcze jakieś hasło administracyjne. Czyli generować inne wartości (dalej podobne do hashy) po podaniu innego hasła podczas procesu kodowania (takim hasłem może być hash, żeby nic nie było jawnie). Czyli: Instalator forum prosi o hasło. To jedyne hasło jest zapisywane w bazie jako zwykły hash. Ten hash jest używany do modyfikacji innych. Jesli ktoś chce zdeinstalować - musi podać to hasło. Hash hasła podany zostaje do funkcji odwrotnej, która zamienia "produkty" w hashe. Kompatybilność załatwiona.

Pytania poza tematem zadajcie sobie w głowie. Jak widzicie tą funkcję, co miałaby pobierać jako wartości do generatora, jak ją napisać, żeby nie zajmowała dużo proca.... wszystkie te rzeczy są do przejścia. Pytanie jaką ceną i ilością czasu.

Pozdrawiam,
przepraszam że tak długo ;] i życzę POWODZENIA :)

PS. MD5 nie ma funkcji odwrotnej tak naprawde. Rainbow tables działają jako stabelaryzowane słowniki. Znaczy to nie mniej, jak to, że istnieją takie hasła, które po zahashowaniu MD5 dają identyczne wartości. Wasza funkcja nie może mieć tej własności z racji istnienia f(x) odwrotnej. MD5 to klucz publiczny. Moja idea twierdzi, że musicie tak naprawde połączyć coś w podobie klucza publicznego i kodowania z f(x) odwrotną.[/scroll]

chelloPL - 07-01-2006, 22:29

przecinek, tiaa - gratulacje - wszystkie 3 dane podane masz w wykradzionej bazie/tabeli.

Nie pamiętam już źródła, gdzie to czytałem (bo było to bardzo dawno), ale od mniej więcej 5-6 miesięcy myślałem o zmianie algorytmu kodowania (i bynajmniej nikomu o tym nie mówiłem), bo uznałem to za kiepskie jeśli chodzi o kompatybilność.
Samo złamanie algorytmu md5 jest możliwe, co już zostało udowodnione - dzięki błędzie w samym algorytmie. Samo kodowanie kilka razy również nie zwiększa bezpieczeństwa hasza, a jedynie wydłuża w pewnym stopniu (nie podaję konkretnych wartości) łamanie tego hasła (nie piszę o łamaniu metodą brutalną).

Z kolei padła propozycja sha1 - jest on trochę bardziej bezpieczny... bo jeszcze nikt nie znalazł sposobu na przyspieszenie łamania haseł.

Ponieważ nie jest to sprawa na 5 minut (jak niektóre osoby wymyślały), stąd muszę się dobrze zastanowić zanim zacznę zgadywać.

przecinek - 07-01-2006, 22:35

chelloPL napisał/a:
przecinek, tiaa - gratulacje - wszystkie 3 dane podane masz w wykradzionej bazie/tabeli.
Nie, nie masz md5 hasła :) .
qbs napisał/a:
przecinek, a co jesli ktos sie loguje? wowczas musialbys wyciagnac id usera z bazy o podanym loginie a pozniej wykonac jeszcze jedno zapytanie by sprawdzic czy dany user ma to haslo. ale pomysl ogolnie najlepszy tylko bez $user_id
No to wtedy admin/haker stworzy słownik dla danego forum, jak Przemo pisał. Aby było szybciej można by user_id zastąpić username, w zasadzie wymagałoby to tylko konieczności podawania hasła przy zmienie nicka i uniemożliwiałoby zmianę nicka przez administratora.
50k07 - 07-01-2006, 22:37

OK, o tym nie wiedziałem, że da się złamać MD5 jeśli mówisz o sposobie nietabelkowym. Idea była taka, żeby niekoniecznie posiadał f(x) odwrotną, a jedynie był kluczem publicznym do porównywania. Nie zmienia to jednak mojego podejścia, że jeżeliby coś zbudować takiego jak pisałem i dałoby to dobry efekt, to dobry efekt zawsze jest pożądany :)
Przemo - 07-01-2006, 22:37

50k07, bardzo mądre słowa zbierające do kupy prawie wszystko o czym tu mowilismy. Skad sie tu wziales? :)
Jednak prawie o wszystkim tym o czym piszesz myslalem przed dezycja o powieleniu md5 (rowniez o slownikach rainbow chociaz nie mialem pojecia o ich istnieniu lecz zrobilem jeden mini slownik do testow i sie sprawdzil :/ )
Nie wiem sam, temat jest dosyc trudny, nie ma idealnego wyjscia albo bezpieczenstwo albo wygoda :/ Bede myslal jeszcze na ten temat.

50k07 - 07-01-2006, 22:41

dziekuje za miłe słowa :) wziąłem się oczywiście z thecamels.org :P hehe taka mała kryptoreklama ;] hehehe ... no więc życzę owocnych przemyśleń. Jak na coś wpadnę to jeszcze napiszę :)

Wpadłem na to, że jak ktoś na coś wpadnie, co wg. niego powinno być użyte do generatora to może niech nie dzieli się tym publicznie tutaj na forum, tylko zróbcie sobie jakiś wątek ukryty, gdzie niewiele osób będzie wchodzić i tam sypcie pomysły (o ile jeszcze takiego nie macie :P ) albo może do Przema na PW? :D ...pewnie sie nie obrazi :P

patrick - 07-01-2006, 23:06

Spokojnie to jest paranoja ... przeciez forum to nie server z haslami kont pkointeligo.
Po co takie kodowania, forum jest skryptem do dyskusji na ktorym uzytkownicy maja zupelnie inne hasla niz na poczty etc. Po drugie co moze sie stac jak jakis zapaleniec wykradnie hash i rozkoduje a po czym usunie temat ?
Przemo z tego co wiem miales robic skrypt coraz bardziej optymalny bez zbednych badziewi.
Md5 jest wystarczajacym algorytmemi nie nazlezy go zmieniac ani mnozyc razy tysiac. Max to 2 tak jak vb.

50k07 - 07-01-2006, 23:14

MD5 nie jest wystarczający, bo po zdekodowaniu które zajmuje niecałe 5 minut dla haseł 8 znakowych jeśli (a niestety najczęściej tak jest) user ma takie samo hasło gdzieś indziej --> "pseudo hacker" włamuje się dalej na gg, pocztę, allegro, może nawet bank jeśli tokeny przychodzą gdzieś na elektroniczne konta. Niebezpieczne forum to często dziura w tożsamosci, nie tylko możliwosc edycji postow (czego również nikomu nie życzę)
przecinek - 07-01-2006, 23:30

Kolejny mój pomysł, który może się dobrze uzupełniać z poprzednim, polega na wymyśleniu takie funkcji, której przeciętna złożoność jest dobra, ale pesymistyczna niska. Chodzi o to, aby może szybko otrzymać odpowiedź "hasło jest poprawne", a uzyskanie odpowiedzi "hasło nie jest poprawne" zajmowało więcej czasu.

Podam przykład, niestety niedoskonały:
Przy ustawianiu hasła system losuje liczbę z zakresu 1000-10000 i tyle razy koduje hasło md5. Algorytm sprawdzający* średnio wykona 5500 operacji, jeśli podane hasło jest prawidłowe, ale aż 10000, jeśli nie jest.

Niestety w tym przypadku mozna zastosować przeszukiwanie wszerz. Co prawda dla 5 znaków i 50 różnych znaków potrzeba na to około 10 GB pamięci, ale na pewno można to jakoś zoptymalizować, więc ta realizacja pomysłu nie jest najlepsza. Jednakże myślę, że sama idea nie jest zła, ale wymaga dopracowania. Mylę się? :->

--
* Wyglądający jakos tak:
Kod:
for(i=0; i<999; i++):
 $pass=md5($pass);
endfor;
for(i=0; i<=9000; i++):
 $pass=md5($pass);
 if($pass===$pass_z_bazy):
  return true;
 endif;
endfor;
return false;



Powered by phpBB modified by Przemo © 2003 phpBB Group