Как обезопасить игровые монеты? - PullRequest
0 голосов
/ 13 сентября 2018

Извините, я новичок в подобных вещах. Я хочу защитить SharedPreferences и хочу сохранить монеты приложений.и не хочет писать / читать.Кто-нибудь может мне помочь ?или дайте мне более простой способ обезопасить игровые монеты.Я не хочу защищаться с помощью firebase, потому что мне нужно работать с серверами: (

Вот ссылка, которую я использую:

Что является наиболее подходящимспособ хранения пользовательских настроек в приложении Android

final SharedPreferences prefs = new ObscuredSharedPreferences(
            this, this.getSharedPreferences("MY_PREFS_FILE_NAME", Context.MODE_PRIVATE)) {
        @Nullable
        @Override
        public Set<String> getStringSet(String key, @Nullable Set<String> defValues) {
            return null;
        }
    };

//Write
prefs.edit().putString("1597", String.valueOf(cc)).commit();
//Read
prefs.getString("1597", null);

Класс:

public abstract class ObscuredSharedPreferences implements SharedPreferences {
protected static final String UTF8 = "utf-8";
public static final char[] SEKRIT = {1597}  ; // INSERT A RANDOM PASSWORD HERE.
// Don't use anything you wouldn't want to
// get out there if someone decompiled
// your app.


protected SharedPreferences delegate;
protected Context context;

public ObscuredSharedPreferences(Context context, SharedPreferences delegate) {
    this.delegate = delegate;
    this.context = context;
}

public abstract class Editor implements SharedPreferences.Editor {
    protected SharedPreferences.Editor delegate;

    public Editor() {
        this.delegate = ObscuredSharedPreferences.this.delegate.edit();
    }

    @Override
    public Editor putBoolean(String key, boolean value) {
        delegate.putString(key, encrypt(Boolean.toString(value)));
        return this;
    }

    @Override
    public Editor putFloat(String key, float value) {
        delegate.putString(key, encrypt(Float.toString(value)));
        return this;
    }

    @Override
    public Editor putInt(String key, int value) {
        delegate.putString(key, encrypt(Integer.toString(value)));
        return this;
    }

    @Override
    public Editor putLong(String key, long value) {
        delegate.putString(key, encrypt(Long.toString(value)));
        return this;
    }

    @Override
    public Editor putString(String key, String value) {
        delegate.putString(key, encrypt(value));
        return this;
    }

    @Override
    public void apply() {
        delegate.apply();
    }

    @Override
    public Editor clear() {
        delegate.clear();
        return this;
    }

    @Override
    public boolean commit() {
        return delegate.commit();
    }

    @Override
    public Editor remove(String s) {
        delegate.remove(s);
        return this;
    }
}

public Editor edit() {
    return new Editor() {
        @Override
        public SharedPreferences.Editor putStringSet(String key, @Nullable Set<String> values) {
            return null;
        }
    };
}


@Override
public Map<String, ?> getAll() {
    throw new UnsupportedOperationException(); // left as an exercise to the reader
}

@Override
public boolean getBoolean(String key, boolean defValue) {
    final String v = delegate.getString(key, null);
    return v!=null ? Boolean.parseBoolean(decrypt(v)) : defValue;
}

@Override
public float getFloat(String key, float defValue) {
    final String v = delegate.getString(key, null);
    return v!=null ? Float.parseFloat(decrypt(v)) : defValue;
}

@Override
public int getInt(String key, int defValue) {
    final String v = delegate.getString(key, null);
    return v!=null ? Integer.parseInt(decrypt(v)) : defValue;
}

@Override
public long getLong(String key, long defValue) {
    final String v = delegate.getString(key, null);
    return v!=null ? Long.parseLong(decrypt(v)) : defValue;
}

@Override
public String getString(String key, String defValue) {
    final String v = delegate.getString(key, null);
    return v != null ? decrypt(v) : defValue;
}

@Override
public boolean contains(String s) {
    return delegate.contains(s);
}

@Override
public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener onSharedPreferenceChangeListener) {
    delegate.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);
}

@Override
public void unregisterOnSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener) {
    delegate.unregisterOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);
}




protected String encrypt( String value ) {

    try {
        final byte[] bytes = value!=null ? value.getBytes(UTF8) : new byte[0];
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT));
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
        pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(),Settings.Secure.ANDROID_ID).getBytes(UTF8), 20));
        return new String(Base64.encode(pbeCipher.doFinal(bytes), Base64.NO_WRAP),UTF8);

    } catch( Exception e ) {
        throw new RuntimeException(e);
    }

}

protected String decrypt(String value){
    try {
        final byte[] bytes = value!=null ? Base64.decode(value,Base64.DEFAULT) : new byte[0];
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT));
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
        pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID).getBytes(UTF8), 20));
        return new String(pbeCipher.doFinal(bytes),UTF8);

    } catch( Exception e) {
        throw new RuntimeException(e);
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...