Widziałem wiele podejść do tematu.
Tak chałupniczo (prosto, bo nie wiadomo co tam masz) to:
- Generujesz parę kluczy do szyfrowania asymetrycznego (u siebie lub na zaufanym serwerze)
- Generujesz wspólny klucz do szyfrowania haseł (tych które chcesz zaszyfrować - może być symetryk)
- Przechowujesz go u siebie (jak rejestracja będzie aktywowana u Ciebie) lub na bezpiecznym serwerze
- Użytkownik dokonuje rejestracji - wysyła login + hasło zaszyfrowane asymetrykiem (pkt 1)
- Całość (login + sól + hasło) w zaszyfrowanej formie (kluczem z pkt 1) jest zapisywana w bazie danych
- Odszyforwujesz u siebie (lub na zaufanym serwerze) dane usera swoim kluczem prywatnym (z pkt 1)
- Generujesz u siebie hash hasła dla usera (do autoryzacji sól + login + hasło)
- Szyfrujesz wygenerowanymi danymi od usera klucz z (pkt 2) - czyli zaszyfrowany klucz do odszyforwania danych (skomplikowane? :D)
- Zapisujesz dwa powyższe punkty w bazie danych
Działanie:
Gdy user się zaloguje pobiera zaszyfrowany klucz (z pkt 2). Może dokonać logowania ponieważ (pkt 7)
Na podstawie swoich danych wygeneruje klucz do odszyfrowania powyższego klucza (po obu stronach musi być ten sam mechanizm tworzenia klucza pkt 8).
Tym kluczem odszyfruje przesłane do niego dane.
Wprowadzając nowe dane do bazy danych, szyfrujesz je kluczem z pkt 2.
Czy da się uniknąć pośrednika (zaufanego serwera lub twojej ingerencji) ?
Nie, ponieważ:
- Masz wspólne dane (dla wielu userów?) - tak się domyślam
- Trzeba jakoś resetować hasło bez utraty danych
- Końcówka znajduje się na "niebezpiecznym terenie".
Wszystko inne jest jeszcze bardziej skomplikowane.
Zastanów się czy to ma sens.
Może lepiej umieścić bazę danych w odseparowanym miejscu i szyfrować ją standardowo?