Android: безопасно ли помещать конфиденциальную строку в мой код Java?

В моем приложении используется ряд ключей и URL-адресов API, которые я не могу разрешить пользователям видеть. Я помещал их непосредственно в код, иногда встраивая в метод, который их использует, а иногда в класс под названием 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
ВТФ!? Файлы свойств еще больше упрощают извлечение пользователями. Просто извлеките файл и откройте его в текстовом редакторе. - person Robert; 17.07.2014
comment
Я думал о том же. Если вы запишете этот материал в SharedPreferences, любой, у кого есть root-доступ, может легко прочитать этот простой текстовый файл с вашего устройства. - person AWT; 17.07.2014
comment
Точно @Robert, я не понимаю, как это более безопасно. Android — это не сервлет-контейнер, в котором вы можете размещать учетные данные веб-приложений в конфигурационных файлах. Любой, у кого есть root-доступ к телефону, может прочитать их, независимо от того, в исходном коде или в файлах. Даже шифрование строк не является безопасным, потому что ключ тоже должен где-то храниться... это только усложняет задачу. - person Blacklight; 17.07.2014
comment
сорри, я перепутал это с чем-то другим. Я не видел, что это было про андроид. - person PKlumpp; 17.07.2014