# <center>Programowanie sieciowe - projekt</center> ## <center>Temat: Implementacja bezpiecznej aplikacji typu czat</center> ### <center>Jakub Liana, Mikołaj Kraczek, Michał Zięba</center> ### Czat dwuosobowy **IK_public** - Identity Key, publiczny, generowany przez użytkownika i publikowany na serwerze **IK_priv** - Identity Key, prywatny, generowany przez użytkownika i nie udostępniadny nigdzie **PK_public** - Publiczny Pre-Key: raz na konkretny interwał czasowy klucz wygenerowany lokalnie u użytkownika i publikowany na serwerze **PK_priv** - Prywatny Pre-Key raz na konkretny interwał czasowy klucz wygenerowany lokalnie u użytkownika i nie udostępniany nigdzie **SPK** - Signed Pre-Key podpisany PK_public przy użyciu IK_priv i publikowany na serwerze Sekwencja utworzenia klucza sesji (*A - użytkownik inicjaluzujący połączenie, B - użytkownik do, którego A chce wysłać wiadomość*): 1. Użytkownik A pobiera z sererwa *pakiet* użytkownika B (IK_public, PK_public, SPK) 2. Weryfikuje czy PK faktycznie pochodzi od użytkowanika B 3. Tworzy parę publiczny i prywatny EK (Ephemeral Key) 4. Użytkownik A oblicza 3 operacje Diffie-Hellman: - `DH1 = DH(IK_A_priv, SPK_B_public)` - `DH2 = DH(EK_priv, IK_B_public)` - `DH3 = DH(EK_priv, SPK_B_public)` 5. Użytkownik A generuje SK (session key): `SK = KDF(DH1 || DH2 || DH3)` 6. Użytkownik A wysyła do B EK_public oraz wiadomość inicjalizacyjną zaszyfrowaną SK 7. Użytkownik B również oblicza te same 3 operacje Diffie-Hellman: - `DH1 = DH(IK_A_public, SPK_B_priv)` - `DH2 = DH(EK_public, IK_B_priv)` - `DH3 = DH(EK_public, SPK_B_priv)` 8. Użytkownik B generuje SK `SK = KDF(DH1 || DH2 || DH3)` 9. Wszyscy są happy, mają ten sam klucz ### Czat grupowy #TODO ### Bazy danych Szyfrujemy całą bazę danych a nie pojedyncze pola. Pomysły na to są 2: - Szyfrowanie dynamiczne: przy zakończeniu sesji szyfrujemy aktualnym SK (albo ewentualnie jakimś jego hashem) i zapisujemy sobie ten klucz. Przy rozpoczęciu nowej sesji odszyfrowujemy bazę stałym kluczem i po zakończeniu z powrotem szyfrujemy aktualnym kluczem, stary usuwamy i zapisujemy ten. - Albo używając klucza **IK_priv**, który i tak nie opuszcza aplikacji, więc możemy go użyć do innych celów przy okazji. Jest to rozwiązanie łatwiejsze w implementacji ### konczenie dzialania klienta musimy przechwytywac wszystkie sygnaly konczace program, aby poprawnie zamknac polaczenie i co najwazniejsze zaszyfrowac baze danych etc