2012-12-29 17 views
11

Skończyłem opracowywać aplikację, która jest używana w rozliczeniach za aplikacje w wersji 3. Moja aplikacja to aplikacja do egzaminu, która zawiera listę pytań, które są wstawiane do bazy danych. Najbardziej martwi mnie bezpieczeństwo, ponieważ poza tym jest niewiele więcej. Moja aplikacja sprawdza zasoby pod kątem kupowanych produktów, więc przechowywanie zakupów nie stanowi problemu.W zabezpieczeniach rozliczeń aplikacji

Tak więc pierwszym problemem jest ktoś, kto może zdekompilować aplikację (co zrobiłem), a nawet z proguardem bez trudu odzyskasz wszystkie pytania.

Następną rzeczą jest klucz publiczny aplikacji. Można to łatwo pobrać z mojej aplikacji i zgodnie z poradnikiem dla programistów, to jest coś, co powinienem zachować.

Jednak tak naprawdę nie wiem, jak wdrożyć jakąkolwiek formę zabezpieczenia. Albo nawet, jak daleko powinienem się posunąć w kwestii bezpieczeństwa. Bez serwera, jeśli przechowuję wszystko na urządzeniu, rozpoznaję, że nie będzie to doskonałe (z dala od niego), ale wolałabym przynajmniej, aby hakerzy byli zniechęceni, a nie rozbawieni.

Więc zasadniczo pytanie brzmi:

Jaki rodzaj zabezpieczenia należy użyć i jak go stosować? Wystarczy wskazać mi linki, które przechodzą przez niego krok po kroku, więc mogę zrozumieć, że byłoby to niesamowite.

Dziękuję bardzo!

Wyjaśnienie:

Brak serwera. Dane są przechowywane w aplikacji. Kiedy inwentaryzacja jest sprawdzana (za pomocą metody queryinventoryasync), jest zwracana, gdy inwentarz jest kupowany lub nie, i jest uruchamiany za każdym razem, gdy aplikacja jest uruchamiana. W samej billingowej aplikacji zakładam, że jest w porządku, pytam więcej o moją własną aplikację, klucz publiczny aplikacji - mam zamiar w jakiś sposób utrudnić kopiowanie, ale obecnie właśnie rozbiłem go na 15 napisów i po prostu "dodaję" one do siebie w czasie wykonywania, ale to niewiele lepiej niż po prostu jako jeden ciąg. Chciałbym zaszyfrować to jakoś tylko nie wiem jak.

+0

http://stackoverflow.com/questions/14352758/android-in-app-billing-securing-application-public-key – Krishnabhadra

Odpowiedz

18

Dobre pytanie.

Klucz publiczny musi być dostępny na urządzeniu, aby można go było użyć. Kiedy pojawi się na urządzeniu, nie jest już tak naprawdę chroniony. Klucz sam w sobie nie jest tajemnicą, ale musimy uczynić możliwą zamianę trudniejszym zadaniem.

Co można zrobić, to użyć tak zwanego szyfrowania XOR. Oto przykład metod kodowania i rozszyfrowywania XOR.

public static String xorEncrypt(String input, String key) { 
    byte[] inputBytes = input.getBytes(); 
    int inputSize = inputBytes.length; 

    byte[] keyBytes = key.getBytes(); 
    int keySize = keyBytes.length - 1; 

    byte[] outBytes = new byte[inputSize]; 
    for (int i=0; i<inputSize; i++) { 
     outBytes[i] = (byte) (inputBytes[i]^keyBytes[i % keySize]); 
    } 

    return new String(Base64.encode(outBytes, Base64.DEFAULT)); 
} 

public static String xorDecrypt(String input, String key) { 
    byte[] inputBytes = Base64.decode(input, Base64.DEFAULT); 
    int inputSize = inputBytes.length; 

    byte[] keyBytes = key.getBytes(); 
    int keySize = keyBytes.length - 1; 

    byte[] outBytes = new byte[inputSize]; 
    for (int i=0; i<inputSize; i++) { 
     outBytes[i] = (byte) (inputBytes[i]^keyBytes[i % keySize]); 
    } 

    return new String(outBytes); 
} 

Jak co musisz zrobić, to wybrać ciąg hasła (String key) i szyfrowanie klucza publicznego (String input) korzystania z niej. Zaszyfrowany klucz, który możesz przechowywać w klasie. Gdy potrzebujesz swojej prawdziwej wartości kluczowej, zadzwoń pod numer xorDecrypt() za pomocą hasła i publicznego (szyfrowanego) ciągu kluczy. Hasło to ciąg, który przechowujesz również w swoim kodzie. Jak już powiedziałem, tak naprawdę nie chronimy tego, ale utrudnia nam znalezienie i/lub zastąpienie.

Można dodać bardziej wyrafinowaną logikę dotyczącą łączenia szyfrowanego klucza publicznego i hasła. To tylko zwiększa złożoność, ale nie daje żadnej gwarancji, że klucz nie zostanie odszyfrowany. W każdym razie szyfrowanie XOR jest lepsze niż nic.

Android 4.3 dodał kilka dodatkowych funkcji bezpieczeństwa, które można wykorzystać do przechowywania kluczy publicznych. To rozwiązanie będzie wymagało komunikacji serwera i wsparcia sprzętowego, aby było naprawdę bezpieczne. Są to Key Chain enhancements and Android Keystore Provider.

+0

Niesamowite odpowiedź. Dodatkowo powinienem podzielić mój zaszyfrowany klucz publiczny na różne części, które łączę ze sobą nawzajem łańcuchy i tasowanie postaci? Rozumiem, że chodzi o to, aby powstrzymać kogoś przed zamianą swojego klucza na twoje, tym samym przekierowując pieniądze uzyskane z zakupu przedmiotów na swoje konto. – AndroidPenguin

+1

Dzięki! a) Tak, możesz również złamać zaszyfrowany klucz publiczny w częściach. To utrudni życie hakera ... lub może będzie bardziej interesujące dla nich. b) Nie bardzo. Chodzi o to, aby trudniej było zastąpić swój klucz publiczny fałszywym. Następnie ponownie zmontuj aplikację, aby zaczęła przyjmować fałszywe odpowiedzi serwera. W ten sposób hakerzy mogą włączyć funkcję bez płacenia za nie. –

+0

'Int rozmiar klucza = keyBytes.length - 1'; to nie jest konieczne. i% rozmiar klucza zawsze mniejszy niż rozmiar klucza, więc nie mamy do minus rozmiar klucza dla 1 –

Powiązane problemy