2010-12-11 26 views
6

Buforuję uwierzytelnianie użytkownika, gdy serwer ping w usłudze Android Market Licensing zwraca tabelę GRANT_ACCESS.Usterki w buforowaniu zaciemnionego klucza? Licencjonowanie systemu Android

Czy ktoś widzi jakiekolwiek luki w zabezpieczeniach dzięki tej strategii? Uważam, że jest bardzo silny, ponieważ ukrywam klucz, a jedynym sposobem na pozbycie się umysłu jest poznanie soli. Teraz ktoś może otworzyć apkę i poszukać soli, ale nie jest to tak naprawdę poziom pękania, który moim zdaniem jest zbyt ważny, by się nim przejmować.

Jak widać, specyficzne dla urządzenia informacje są dodawane do techniki obfuskacji.

// Try to use more data here. ANDROID_ID is a single point of attack. 
String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 
obfuscator = new AESObfuscator(SALT, getPackageName(), deviceId); 
mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, obfuscator), BASE64_PUBLIC_KEY); 

Następny utworzenie danych utrwalonej:

public void allow() { 
    SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    String uid = UUID.randomUUID().toString(); 
    if(!settings.contains(ACCESS_KEY)) { 
    editor.putString(ACCESS_KEY,uid);  
    editor.commit(); 
    } 
    if(!settings.contains(OBFU_ACCESS_KEY)) { 
    String obfu = obfuscator.obfuscate(uid); 
    editor.putString(OBFU_ACCESS_KEY,obfu); 
    editor.commit(); 
    } 

Następnie użyłem innej metody, aby sprawdzić stan pamięci podręcznej treści:

boolean isCachedLicense() { 
    SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0); 
    if(settings.contains(ACCESS_KEY) && settings.contains(OBFU_ACCESS_KEY)) { 
    String accessKey = settings.getString(ACCESS_KEY, ""); 
    String obAccessKey = settings.getString(OBFU_ACCESS_KEY, ""); 
    try { 
     if(accessKey.equals(obfuscator.unobfuscate(obAccessKey))) { 
       return true; 
     } else { 
       return false; 
     } 
    } catch (ValidationException e) { 
     e.printStackTrace(); 
     return false; 
    } 
    } else { 
     return false; 
    } 
} 

Wreszcie sprawdziłem czy isCachedLicens e w następujących lokalizacjachi @override applicationError. Jeśli wartość isCachedLicense jest prawdziwa, pozwolę użytkownikowi przejść do przodu.

Pełny kod źródłowy znajduje się pod adresem here.

Odpowiedz

1

Obfuscowanie solą jest ogólnie rzecz biorąc słabą strategią. Atakujący musi po prostu dowiedzieć się o soli, co jest dość proste do zrobienia, gdy wiesz, czego szukasz, i można to zrobić bez bezpośredniego dostępu do aplikacji. Gdy sól zostanie odkryta (przez kogokolwiek), cała nasza baza instalacyjna została naruszona.

Najlepszym rozwiązaniem jest, zamiast używać algorytmu zaciemniania z ustalonym kluczem, użycie sprawdzonej biblioteki szyfrowania i algorytmu z kluczem, który jest unikalny dla użytkownika lub urządzenia, z którego korzystasz.

+0

Używam sprawdzonej biblioteki szyfrowania, zobacz pełny kod dla odniesienia. – hunterp

+1

To o krok lepszy - biblioteka wydaje się robić wystarczająco przyzwoitą pracę. Osoba atakująca będzie teraz musiała odszyfrować dane każdego urządzenia osobno i mieć wystarczający dostęp do urządzenia, aby móc uruchomić odszyfrowanie urządzenia. Jednak globalna sól wciąż jest słabym punktem. A ponieważ wygląda na to, że rozpowszechniasz to jako bibliotekę, istnieje dodatkowe niebezpieczeństwo, że użytkownicy końcowi nie będą wypełniać swoich własnych wartości soli. Szanse są takie, że zbyt duża populacja deweloperów pozostawi go na wartości, które wprowadziłeś - zmieniłbym to na wartość generowaną oddzielnie dla każdego urządzenia. – blueberryfields

+0

Jeśli spojrzysz na referencję, już mam informacje o urządzeniu wchodzące w skład miksu szyfrowania (zmieniłem też moje pytanie, aby umieścić te informacje na górze) – hunterp