Sto memorizzando nella cache l'autenticazione di un utente ogni volta che il server ping di Android Market Licensing restituisce un ping GRANT_ACCESS.Vulnerabilità nella memorizzazione nella cache della chiave offuscata? Licenze Android
Qualcuno vede qualche vulnerabilità con questa strategia? Credo che sia molto forte, dal momento che sto offuscando una chiave, e l'unico modo per non offuscare è conoscere il sale. Ora, qualcuno potrebbe idealmente aprire l'apk e cercare il sale, ma questo non è proprio il livello di cracking che penso sia troppo importante per preoccuparsi.
Come si può vedere, informazioni specifiche del dispositivo vengono aggiunte alla tecnica di offuscamento.
// 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);
successivo la creazione dei dati persistente:
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();
}
Poi, ho usato un altro metodo per controllare lo stato del contenuto memorizzato nella cache:
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;
}
}
Infine, ho controllato se isCachedLicens
e nelle seguenti posizioni di LicenseCheckerCallback
: @Override dontAllow
e @override applicationError
. Se isCachedLicense
è vero, allora lascio andare l'utente.
Inoltre, il codice sorgente completo si trova in here.
Io uso una comprovata libreria di crittografia, vedere il codice completo per riferimento. – hunterp
Questo è un passo migliore: la biblioteca sembra fare un lavoro abbastanza decente. L'utente malintenzionato dovrà ora decodificare i dati di ciascun dispositivo separatamente e avere abbastanza accesso al dispositivo per poter eseguire il decryptor specifico del dispositivo. Il sale globale, tuttavia, è ancora un punto debole. E poiché sembra che tu stia distribuendo questo come una biblioteca, ha il pericolo aggiunto che gli utenti finali non inseriscano i propri valori di sale. Le probabilità sono che una popolazione di sviluppatori troppo grande la lascerà ai valori che hai inserito - La cambierei ad un valore che è generato separatamente per ogni dispositivo. – blueberryfields
se dai un'occhiata al riferimento, ho già informazioni specifiche del dispositivo che entrano nel mix di crittografia (ho anche modificato la mia domanda per includere queste informazioni in alto) – hunterp