Android: Безопасно ли е да поставя чувствителен низ в моя Java код?

Приложението ми използва няколко API ключове и URL адреси, които не мога да позволя на потребителите да виждат. Поставям ги директно в кода, понякога вградени в метода, който ги използва, а понякога в клас, наречен MyVals, който съхранява често използвани низове и числа.

e.g.:

public class MyVals {

    private LGVals(){}

    public static final String DB_URL = "https://mydb.dbprovider.org/";
    public static final String DB_Key = "klJF*(oh8iyhkkde";
    public static final String TableKey_UserList = "o9w6owifhayf98fnwihj";

}

Това безопасно ли е? Има ли разлика, ако създавам моя APK с Proguard? Коя е най-добрата практика за това?


person Scott    schedule 17.07.2014    source източник
comment
Най-добрата практика са акаунти, базирани на използване. Всичко друго може да бъде извлечено от вашето приложение.   -  person Robert    schedule 17.07.2014
comment
Проблемът е, че дори и да объркате своите низове, в даден момент приложението ви също трябва да може да върне това обфускация. Ако някой е решен да разбере тези идентификационни данни, е възможно да ги разбере, без значение дали са вградени или съхранени във файл със свойства или някъде другаде. Ако имате контрол върху дизайна на тази уеб услуга, трябва да изискате от потребителя на вашето приложение да се регистрира и да извлече индивидуален ключ за достъп от сървъра, вместо да разпространява един главен ключ.   -  person tiguchi    schedule 17.07.2014
comment
не. никога. ако защитавате нещо значимо, няма безопасен начин да поставите ключа на устройството.   -  person G. Blake Meike    schedule 17.07.2014
comment
Re: значение, това не е приложение за мобилно банкиране или нещо такова. Най-вече бих искал да предотвратя вандализъм, въпреки че е възможно поведението на потребителите също да бъде прочетено. Но ако не сложите ключ на устройството, дори и да е замъглен, къде го слагате? Как давате разрешение на приложението да изтегля лични данни? Единственото предложение, което видях, частен сървър, не решава проблема, тъй като ключът за това трябва да е на устройството!   -  person Scott    schedule 17.07.2014
comment
Има няколко близки гласувания на основание, че това се основава на мнение. Не съм съгласен - в строги условия на крипто, или е безопасно да се направи това, или не е.   -  person DNA    schedule 17.07.2014


Отговори (2)


Абсолютно не е безопасно да вграждате чувствителни низове във вашия код. Proguard замъглява имената на класа и метода, но всички дефинирани низове остават напълно непроменени. Ето пример от приложение, което пуснах през Proguard. Можете да видите, че имената на метода и класа са объркани, но низовете (както трябва да бъдат) са непроменени.

Ето оригиналния код:

public void shutdown() {
    if (logger.logDebug()) {
        logger.logDebug(LOGTAG, "Queuing shutdown message ...");
    }

    queueMessage(new BaseMessage(true));
}

И обфусцираният код, лесно получен от JD-GUI:

  public void c()
  {
    if (c.logDebug())
      c.logDebug("MsgRouter", "Queuing shutdown message ...");
    a(new a(true));
  }

Ако вградите чувствителни данни в низ във вашето приложение, той може и ще бъде декомпилиран.

person AWT    schedule 17.07.2014
comment
И така, какво да правим?! - person Dr.jacky; 19.10.2015

Не, това не е сигурно.

Трябва поне да поставите информацията в SharedPreferences.

Но все пак всеки с root достъп може да ги прочете.

person PKlumpp    schedule 17.07.2014
comment
Само за да допълня другия въпрос, Proguard не докосва буквални низове, той само ще промени името си като DB_Key на A. - person Pozzo Apps; 17.07.2014
comment
WTF!? Файловете със свойства го правят още по-лесно за потребителите да го извлекат. Просто извлечете файла и го отворете с текстов редактор. - person Robert; 17.07.2014
comment
И аз си мислех същото. Ако напишете тези неща в SharedPreferences, всеки с root достъп може лесно просто да прочете този обикновен текстов файл от вашето устройство. - person AWT; 17.07.2014
comment
Точно @Робърт, не виждам как това е по-сигурно. Android не е сервлет-контейнер, където можете да поставите идентификационни данни на уеб приложения в конфигурационни файлове. Всеки с root достъп до телефона може да ги чете, без значение дали в изходния код или във файлове. Дори криптирането на низове не е сигурно, защото ключът също трябва да се съхранява някъде.. това само го прави по-трудно. - person Blacklight; 17.07.2014
comment
съжалявам, обърках това с нещо друго. Не видях, че става въпрос за android. - person PKlumpp; 17.07.2014