Защитить строковую константу от обратного инжиниринга - PullRequest
23 голосов
/ 15 сентября 2011

У меня есть приложение для Android с жестко закодированными (статическими строковыми константами) учетными данными (пользователь / пароль) для отправки электронных писем по SMTP.

Проблема в том, что файл .dex в .apk может быть легко перепроектирован, и каждый сможет увидеть мой пароль.

Есть ли способ защитить эти учетные данные, хотя я все еще смогу использовать их в своих классах?

Ответы [ 9 ]

5 голосов
/ 27 июня 2016

Мы можем использовать «jni module», чтобы сохранить «Sensitive Hardcoded Strings» в приложении.когда мы пытаемся выполнить обратный инжиниринг APK-файла, мы получаем папку lib и файлы .so в соответствующих папках процесса.который не может расшифровать.

3 голосов
/ 15 сентября 2011

Вы можете сохранить свою строку, запутанную AES.

В библиотеке проверки лицензий вы можете найти AESObfuscator. В LVL он используется, чтобы скрыть информацию о кешированной лицензии, которая читается, вместо того, чтобы просить Android Market выяснить, лицензировано приложение или нет. LVL можно загрузить как компонент SDK.

3 голосов
/ 15 сентября 2011

Полагаю, вы можете попробовать обфускатор кода, но на самом деле это не сделает ваш пароль на 100% безопасным, и я не знаю, насколько хорошо он работает вместе с компилятором Android.Почему бы не использовать безопасную веб-аутентификацию, например Google?

2 голосов
/ 15 сентября 2011
  1. Хеширование невозможно, так как это не два пути.
  2. Любое шифрование, такое как AES, DES, Blowfish, Etch, не является жизнеспособным решением, так как вы должны включить часть дешифрования в ваше приложениеи это может быть декомпилировано с помощью комбинации apktool, dex2jar и JD (java decompiler), которая является очень мощной комбинацией при декомпиляции любого apk.
  3. Даже обфускаторы кода ничего не делают, кроме как делают жизнь немного сложнеедля парня с декомпиляцией, который в конечном итоге получит его.

Единственный способ, который, я думаю, сработает, - разместить учетные данные на сервере, к которому только ваше приложение может получить доступ черезвызов веб-службы через отдельную аутентификацию какого-то рода - аналогично хэш-ключу FB.Если это работает для них, это должно работать для нас.

1 голос
/ 19 сентября 2011

Я искал похожую проблему и наткнулся на эту полезную тему: http://www.dreamincode.net/forums/topic/208159-protect-plain-string-from-decompilers/

Я не слишком знаком с разработкой Android, но те же идеи должны применяться.

0 голосов
/ 05 сентября 2018

сделать это было бы полезно:

1 - вы можете зашифровать их и запутать алгоритм шифрования.Любое шифрование вместе с обфускацией (progaurd в Adnroid) полезно.

2 - вам лучше жестко закодировать ваши строки как байтовый массив в вашем коде.многие приложения обратного инжиниринга могут получить список ваших жестко закодированных строк и угадать, что они из себя представляют.но когда они находятся в форме байтового массива, они не читаются.но опять же прогуард нужен.(он скрывается только от поиска констант в ОЗУ, и они все еще доступны для поиска из файла .class)

3 - использование кода C ++ для размещения вашей константы - неплохая идея, если вы шифруете их перед жестким кодированием и дешифруете их с помощью C ++code.

здесь также есть отличная статья:

https://rammic.github.io/2015/07/28/hiding-secrets-in-android-apps/

0 голосов
/ 05 сентября 2016

Один способ, которым вы можете на 100% обезопасить жестко закодированную строку. Во-первых, не используйте про-охранник использовать аллатори Ссылка: http://www.allatori.com/

И, во-вторых, не используйте жестко закодированную строку в любой переменной, просто используйте эту строку следующим образом:

if(var=="abc"){}

"abc" - пример строки с жестким кодом.

Allatori полностью запутывает все строки, которые используются в коде, как указано выше.

Надеюсь, это поможет вам.

0 голосов
/ 16 сентября 2011

Используйте какое-то тривиальное шифрование или шифр, который понимают только вы (и ваш код).Переверните строку, сохраните ее как массив целых чисел, где вам нужно взять мод 217 или что-то глупое, чтобы найти реальный пароль.

0 голосов
/ 15 сентября 2011

Если у вас нет средств для веб-авторизации, вам нужно будет включить в ваше приложение стороннюю расшифровку.

Это то, что вы можете попробовать 1) Написать отдельную программу только для созданияхэш пароля один раз.(Эта программа не должна быть частью вашего приложения).Запишите хэш, который был сгенерирован.http://www.mindrot.org/projects/jBCrypt/

 // Hash a password for the first time.
    String hashed = BCrypt.hashpw(password, BCrypt.gensalt(12));

2) Сохраните этот хэш пароля как строковую константу в вас APK.

3) Затем каждый раз, когда вам нужно проверить пароль, сравнивайте схеширует пароль, используя bcrypt.

// Check that an unencrypted password matches one that has
// previously been hashed
if (BCrypt.checkpw(candidate, hashed))
    System.out.println("It matches");
else
    System.out.println("It does not match");

jBCrypt - это отдельный файл Java, который может быть непосредственно включен в ваше приложение.Он считается одним из самых надежных алгоритмов шифрования паролей.Даже через алгоритм расшифровки присутствует в вашем APK, пытаясь взломать это очень трудоемкие подробности, о которых можно прочитать в статье ниже.

Прочтите эту статью для подробностей и безопасности bcrypt.
http://codahale.com/how-to-safely-store-a-password/

Опять же, используйте это, только если у вас нет средств для проверки подлинности через Интернет.

...