2009-09-09 4 views
7

Zajmuję się tworzeniem aplikacji, która łączy się z interfejsem API opartym na XML. Mam kontrolę zarówno nad serwerem, jak i aplikacją - czy jest jakiś sposób, aby upewnić się, że tylko moja aplikacja może uzyskać dostęp do interfejsu API?Bezpieczna komunikacja między iPhone'em i serwerem?

Brak uwierzytelnienia użytkownika.

EDIT:

Głównym problemem jest to, że boty kradzieży danych poprzez skanowanie kodu XML.

Jak o tym:

zażądać sesję z UDID urządzenia i uzyskać klucz Handshake.

<handshake>23354</handshake> 

od tego napisu hasło zostanie obliczony zarówno serwera i klienta zgodnie z ustalonym algorytmem (to po prostu musi być trudne do odtworzenia)

Załóżmy teraz, że mogę dodać 1 do klucz handshake

password = 23354 

Przy wszystkich wywołaniach API przekazuję to hasło wraz z identyfikatorem UDID. Pozwoliłoby to serwerowi ograniczyć każdą sesję do określonej liczby połączeń, nie?

Co myślisz?

Odpowiedz

2

Możesz podać mechanizm szybkiego reagowania na wyzwanie, zakładając, że masz kontrolę nad interfejsem API XML.

Wygeneruj numer i dołącz go do swojej aplikacji i po stronie serwera. Użyj tego jako nasienia dla srand() na kliencie i serwerze.

Czy żądanie od klienta to coś takiego:

<handshake id="123">12312931</handshake> 

tam id oznacza 123'rd generowane liczbę losową i 12312931 jest wartością po wywołaniu rand() 123 razy. Wartość 123 powinna być losowo wygenerowaną liczbą (wygenerowaną z innym nasieniem!).

Nie jest to trudna odpowiedź, ale jest prosta i wydajna i nie polega na niczym innym, jak na zwykłym zestawie bibliotek ANSI C.

Zauważ, że nie jest to zbyt bezpieczne - wystarczy, że Twój klient rzuci wyzwanie swojemu serwerowi, a następnie wygeneruj (w tym przykładzie) 123 losową liczbę dla każdej wartości początkowej, dopóki go nie odnajdą. Więc nie użyłbym tego, spodziewając się, że będzie zapewniał uwierzytelnianie na poziomie kryptograficznym lub kontrolę dostępu. Zapewnia prostą, nie trywialną odpowiedź na wyzwanie, która jest skuteczna i łatwa do wdrożenia.

+0

Nie wierzę, że istnieje jakakolwiek obietnica, że ​​sekwencja zwrócona przez rand() będzie taka sama z platformy na platformę. POSIX nie wydaje się definiować rzeczywistego algorytmu, tylko minimalne wymagania. Zakładam, że powyższy serwer wybiera "123". Jeśli klient go wybierze, nie zapewni to żadnego bezpieczeństwa (nawet banalne zabezpieczenia). Jeśli serwer wyśle ​​id, są szybsze przerwy niż obliczanie wszystkich wartości dla nasion 64k. Najbardziej oczywiste jest dla MiM sesji. Mogę również znaleźć materiał siewny znacznie szybciej, rzucając wyzwanie klientowi o id = 1, a następnie id = 2 dla kilku kolizji. –

0

Dostęp do usługi internetowej za pośrednictwem protokołu https z uwierzytelnianiem.

+0

Tak, ale jak? Próbuję to rozgryźć na iPhonie. Z jakich klas korzystasz? – Spanky

3

Nie, nie można zagwarantować, że tylko aplikacja może skontaktować się z serwerem. Istnieją techniki obfuskacji służące do podniesienia poprzeczki nieco atakującym, a te będą działać dla większości napastników. Twój podstawowy problem nie może zostać rozwiązany przez dedykowanego atakującego. Listę innych postów na ten temat można znaleźć pod adresem iPhone: How to encrypt a string. Istnieje kilka technik, których można używać w tych postach, oraz omówienie, w jaki sposób i czy należy zaatakować podstawowe problemy.

1

Możesz użyć podpisu, aby sprawdzić, czy to rzeczywiście twoja aplikacja nawiązuje połączenie, obliczasz podpis zarówno po stronie serwera, jak i aplikacji, tylko jeśli pasują, usługa powróci z odpowiedzią na żądanie . Zazwyczaj podpisy składają się z kilku parametrów funkcji, po których następuje tajny klucz, a następnie użyj skrótu md5 i przepchnij go. W takim przypadku nikt nie będzie w stanie znaleźć tajnego klucza, ponieważ znajduje się on w hashu md5.

+0

Niestety sekretny klucz musi zostać zakodowany w twoim programie, który następnie musisz podać użytkownikom. Osoba atakująca odtworzy tajny klucz z pliku wykonywalnego (lub z pamięci w debugerze), a następnie użyje go do połączenia się z serwerem. Albo zmodyfikuje twój program, by zrobił to, co chce, i niech twój program poradzi sobie z tajnym uściskiem dłoni. Jest to forma zaciemniania, ale nie rozwiąże problemu, jeśli masz jakąś dedykowaną osobę atakującą. –

-2

Myślę, że prawdziwe pytanie, które należy zadać, to stopień narażenia danych na atak. Powiedziałbym, że 99% czasu będzie w porządku z tylko zaciemnionym adresem URL, który będzie trudny do odgadnięcia, ponieważ szanse przeciętnego użytkownika próbującego zrobić z nim coś poza aplikacją są niewielkie. Jeśli obawiasz się, że konkurenci okradają Ciebie, proponuję coś bardziej niecnego:

W swojej aplikacji skonfiguruj tak, aby Twoja aplikacja i serwer zmieniały adresy URL co jakiś czas, być może co dwa tygodnie. Wtedy, jeśli ktoś spróbuje uzyskać dostęp do interfejsu API XML, będzie walczył nieustannie o szukanie adresów URL. I jako wisienka na torcie utrzymuj stare adresy URL aktywne, ale niech zwrócą złe dane. Myślę, że możesz pozwolić swojej wyobraźni działać i dowiedzieć się reszty stąd.

+0

W jaki sposób aplikacja określa, jaki będzie właściwy adres URL? Niezależnie od zastosowanej techniki może być powielana przez każdego, kto odwraca inżynierów aplikacji. Podobnie, po prostu wąchanie ruchu w legalnej aplikacji będzie wskazywało aplikacji, z której należy się połączyć. To rozwiązanie jest skomplikowane do wdrożenia bez wpływu na legalnych użytkowników (którzy mogą mieć problemy podczas każdego przejścia), ale jest to kolejna wersja wspólnego tajnego klucza, z wyjątkiem tego, że ten sekret nie jest nawet zaszyfrowany na drucie (ponieważ URL nie może być) . –

+0

To nie jest pomocna odpowiedź, ponieważ w ogóle nie odpowiada na ich pytanie. Ponadto nie zapewniasz żadnego realnego mechanizmu robienia tego, co sugerujesz. – Ryan