Nie ma absolutnej metody osiągnięcia tego celu. Jeśli masz usługę sieciową, która korzysta z poświadczeń udostępnionych (po pakiecie w aplikacji), będzie możliwe odtworzenie tego poświadczenia. Ostatecznie niemożliwe jest zapewnienie, że klient działający na innej maszynie jest "twoim" klientem.
Było wiele dyskusji na ten temat. To nie jest beznadziejne, a jedynie niemożliwe do rozwiązania w 100% (a nawet 90%). Prosty wspólny sekret przez SSL zatrzyma większość atakujących bez szkody dla użytkowników lub będzie kosztować dużo. Jest to zaciemnianie, a nie bezpieczeństwo, ale tanie i "w większości skuteczne" jest dużo lepsze niż drogie i "w większości skuteczne".
Jeśli masz produkt o bardzo wysokiej wartości, może to uzasadniać bardziej agresywne (kosztowne) rozwiązania. Wszystkie te rozwiązania to jedna z dwóch rzeczy:
- Uwierzytelnianie użytkownika zamiast programu lub
- Nieprzerwana czujność, obserwując nowych ataków i reagowanie z poprawek, które je załatać.
Ten ostatni jest bardzo drogi i nigdy się nie kończy. Upewnij się, że warto.
Niektóre inne użyteczne dyskusje:
EDYCJA Chciałem wskazać jedną rzecz na temat mojej wzmianki o "wspólnym sekretem przez SSL". Pamiętaj, że jeśli nie weryfikujesz certyfikatu, podlegasz bardzo łatwym atakom typu "man-in-the-middle". Łatwo dostępne serwery proxy, takie jak Charles, mogą to zrobić. Najlepszym rozwiązaniem jest upewnienie się, że zwrócony certyfikat SSL jest podpisany przez swój główny certyfikat, a nie tylko "dowolny zaufany certyfikat". Możesz ponownie skonfigurować, które certyfikaty są zaufane przez Twoją aplikację, pod numerem SecTrustSetAnchorCertificates()
. iOS5:PTL opisuje tę technikę w rozdziale 11 (strona 221). Zawinęłem to również w bibliotece o nazwie RNPinnedCertValidator.
Inną dobrą warstwą jest wdrożenie systemu odpowiedzi-wyzwania, w którym serwer potwierdza, że klient ma wspólny sekret, nigdy nie umieszczając go na drucie. Artykuł w Wikipedii pod numerem Challenge-resonse authentication zawiera dobre wyjaśnienie algorytmu.
Powinieneś naprawdę przyjąć poniższą odpowiedź. To jest bardzo dobre. –