Я только что запутал свой код Android с помощью proguard, а затем декомпилировал его. Есть ряд строк, которые я действительно хотел бы скрыть от посторонних глаз. Когда я декомпилировал свой код, строки были доступны для всеобщего обозрения ... и изменения. Одна из строк - это URL-адрес моего сервера лицензирования, и они могут фактически изменить URL-адрес, чтобы указать на поддельный сервер (поскольку я буду публиковать код сервера). Каков наилучший способ скрыть такого рода информацию?
Кроме того, я заметил, что все строки класса R представляют собой случайные числа, но я не могу найти класс R в декомпилированном коде. Где он?
Вражеский пример, который я вижу: new SimpleCursorAdapter(localActivity, 2130903058, localCursor, arrayOfString, arrayOfInt);
2130903058 - это файл макета, но на что он ссылается? Число ничего не значит, если оно не указывает на какой-то адрес.
Переведено автоматически
Ответ 1
Предполагая, что вас устраивает obscure, а не secure, вы могли бы использовать ряд механизмов, но такие обфускаторы, как proguard, не смогут вам помочь.
Для достижения этого вам нужно будет самостоятельно выполнить кодирование строки, используемый вами подход зависит от того, от чего вы пытаетесь защититься, если вы просто пытаетесь скрыть это от очевидной проверки, то кодирования может быть достаточно (см. android.util.Base64, http://developer.android.com/reference/android/util/Base64.html). Обратите внимание, что кодирование НИКОИМ ОБРАЗОМ НЕ БЕЗОПАСНО, и все, к чему это приведет, - это удалить очевидную ссылку на ваш сайт.
Если вы пытаетесь защититься от чего-то большего, то вы могли бы перейти к фактическому шифрованию строки, для этого вы бы использовали симметричный шифр, такой как AES, через javax.crypto.Cipher, http://www.androidsnippets.org/snippets/39/index.html предоставляет достойный пример использования. Опять же, это более раздражает, чем безопасность для потенциальных хакеров, поскольку вам нужно будет хранить ключ где-нибудь в вашем jar, тем самым сводя на нет любую криптографическую безопасность.
Чтобы было понятнее, основными шагами будут:
Создайте зашифрованную строку вручную, используя известный ключ.
Преобразуйте свой код для использования расшифрованной версии этой строки, пример:
publicclassFoo { privateStringencrypted="<manually created encrypted string>"; privateStringkey="<key used for encryption"; privateStringmySecret= MyDecryptUtil.decrypt(encrypted, key);
... }
(хорошей) альтернативой всему этому является рассмотрение возможности использования стороннего решения drm, такого как сервер лицензирования, который предоставляет Google http://android-developers.blogspot.com/2010/07/licensing-service-for-android.html. Это может быть более безопасным, чем то, что вы создаете самостоятельно, но на него распространяются ограничения, очень похожие на те, что я описал выше.
Ответ 2
Всем привет.
Пусть secret - текст, который вы хотите скрыть
Найдите хэш ключа вашего debug / release.keystore. Пусть k1 будет этим ключом.
В вашем Java-коде Android запишите encrypted. Когда вам понадобится расшифрованная версия encrypted (это оригинал secret), напишите
original = decode(encrypted, get_my_keyhash_programmatically() )
Вот и все. Это работает, потому что оригинал secret не отображается ни в исходном коде Java, ни в k1 способах его декодирования. И, если хакер хочет распечатать ваш расшифрованный секрет, он должен изменить код и перекомпилировать, подписав свой .apk своим собственным хранилищем ключей, а не вашим, и, таким образом, не получив правильный оригинал secret. ("Единственный" вопрос заключается в том, k1 можно ли вычислить из вашего исходного файла .apk).
Примечание: get_my_keyhash_программно():
try { PackageInfoinfo= getPackageManager().getPackageInfo( "el nombre de su paquete por ejemplo com.tarea.u8", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigestmd= MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } } catch (PackageManager.NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
Ответ 3
что я сделал, так это создал длинный список статических строк в моем глобальном служебном классе. Где-то в длинном списке строк я поместил свой пароль несколькими частями.
с помощью моего кода легко увидеть, каковы настоящие ключи доступа, но как только обфускатор заработает, у всей статики будут имена, такие как A, B, C и т.д., И их будет нелегко обнаружить.
Ответ 4
Я использовал ROT47. Это не очень безопасно, но просто в использовании и реализации, потому что это симметричный кодер / декодер