Niestety nie znalazłem osobnego działu na tematykę bezpieczeństwa ponad PHP oraz JS, więc umieszczam tutaj - proszę moda o przeniesienie jeżeli widzi lepsze miejsce dla tego tematu.
Zagadnienie: bezpieczne logowanie bez użycia SSL (https)
Szukałem w Googlach bezpiecznego rozwiązania ale padały same dość... nieprzemyślane rozwiązania. Wśród nich znalazłem ynteligentne takie jak:
- Obliczanie hashu hasła przed wysłaniem - co jest całkowicie bez sensu, bo hacker złapie hash i go prześle = ma dostęp, jedynie nie uzyska źródłowego hasła
- Własna funkcja szyfrująca - to chyba wiadomo że bez sensu ze względu na to że JS jest client-side
- Kombinacja aktualnego czasu z hashem - j/w
Po przemyśleniach wpadłem na rozwiązanie.
Fakty:
Jak wiadomo, hacker może za pomocą sniffera przechwycić dane przesyłane w obu kierunkach.
Istnieje również implementacja - i to nie jedna - MD5() dla Javascriptu.
Nie istnieje metoda zabezpieczenia przed atakiem MitM bez użycia HTTPS - poniższe rozwiązanie powinno bronić przed snifferem.
- Skrypt trzyma w sesji random string (im dłuższy, tym lepiej, ale rozsądnie) który jest zmieniany przy każdym ponownym załadowaniu formularza lub pomyślnym zalogowaniu
- Formularz posiada pole typu hidden z losowym ciągiem z sesji wygenerowanym w pkt. 1
- Przed wysłaniem formularza, jest wykonywana u klienta funkcja md5 ( md5(random) + md5(password) ); wynik funkcji jest przesyłany jako hasło
- Skrypt porównuje otrzymane dane: md5 ( md5($_SESSION["random"]) + $db->passwordHash ) == $_POST["password"]. Jeżeli wartość z pola hidden =/= wartość z sesji to prośba o ponowne wypełnienie formularza, jeżeli warunek się nie zgadza to błąd logowania.
Wady:
- MD5 jest dość słabym skrótem - przy odpowiednim nakładzie czasu/pieniędzy jest do złamania (może SHA2 w JS?)
- Wymaga Javascriptu po stronie klienta; oczywiście można to wykonać tak, że przy wyłączonym JS to zabezpieczenie nie jest używane
- Atak MitM całkowicie pokonuje to "zabezpieczenie"
Czy takie rozwiązanie da mocną ochronę przed snifferami, czy coś pomyliłem? Co można jeszcze ulepszyć?
Pozdrawiam, aso