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.
Używam sprawdzonej biblioteki szyfrowania, zobacz pełny kod dla odniesienia. – hunterp
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
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