Android в приложение биллинга: обеспечение заявки открытого ключа
из Android в приложении Биллинг версии 3 (TrivialDrive)пример приложения поставляется с sdk
MainActivity.java
/* base64EncodedPublicKey should be YOUR APPLICATION'S PUBLIC KEY
* (that you got from the Google Play developer console). This is not your
* developer public key, it's the *app-specific* public key.
*
* Instead of just storing the entire literal string here embedded in the
* program, construct the key at runtime from pieces or
* use bit manipulation (for example, XOR with some other string) to hide
* the actual key. The key itself is not secret information, but we don't
* want to make it easy for an attacker to replace the public key with one
* of their own and then fake messages from the server.
*/
String base64EncodedPublicKey = "CONSTRUCT_YOUR_KEY_AND_PLACE_IT_HERE";
Ну я не уверен, что понимаю эту меру безопасности. Я знаю, как получить открытый ключ приложения (который уже закодирован в базе 64) из консоли разработчика Google Play.
то, что я не понимаю, это часть
/* Instead of just storing the entire literal string here embedded in the
* program, construct the key at runtime from pieces or
* use bit manipulation (for example, XOR with some other string) to hide
* the actual key
*/
насколько я знаю, этот открытый ключ является постоянной строкой, которая задается из Google во время процесса загрузки приложения.
Как мы можем создать один и тот же ключ программно, используя любой процесс обработки битов? Кто-нибудь делал это раньше? Есть ли пример кода, как это сделать?
6 ответов:
что-то вроде этого:
String Base64EncodedPublicKey key = "Ak3jfkd" + GetMiddleBit() + "D349824";
или
String Base64EncodedPublicKey key = DecrementEachletter("Bl4kgle") + GetMiddleBit() + ReverseString("D349824");
или все, что не помещает ключ в открытый текст base64 в одной строке. Вероятно, также что-то, что не хранит ключ в base64, было бы хорошей идеей, так как необработанные текстовые фрагменты base64 довольно легко обнаружить.
это не особенно хороший способ защитить ключ. Но он защищает от тривиальной атаки, когда кто-то просто ищет литеральные строки в вас APK ищет что-то похожее на открытый ключ в кодировке base64. По крайней мере, вы делаете #$# $ ers работают немного.
предположительно, злые люди могут делать плохие вещи, если они определяют ваш публичный ключ. Google, кажется, так думает, по-видимому. Я могу догадаться, что делает этот шаг, но я не уверен, что действительно хочу размышлять об этом на открытом форуме и давать кому-либо какие-либо идеи. Но ты хочешь это сделать.
основной сюжет будет то, что вы делаете его более трудным для кто-то, чтобы написать приложение, которое программно-де-сама собой приложений.
предполагается, что любой, кто делает это, зарабатывает на жизнь, взламывая 20 или 30 000 приложений для android и переиздавая их. Скорее всего, я полагаю, что они не собираются тратить дополнительные десять минут, чтобы добавить ваше приложение в список 20 000 приложений для Android, которые уже были сломаны программой, если им действительно нужно немного ручной работы. Если у вас нет приложения верхнего уровня. А потом битва потенциально бесконечен и, вероятно, в конечном итоге бесполезно.
разделение ключа на последовательные куски (как предложено в другом ответе), вероятно, недостаточно хорошо. Потому что ключ будет в конечном итоге в последовательных строках в строковых таблицах констант в APK. Слишком легко найти это с помощью программы.
альтернативой является выполнение некоторых базовых преобразований на ключе.
// Replace this with your encoded key. String base64EncodedPublicKey = ""; // Get byte sequence to play with. byte[] bytes = base64EncodedPublicKey.getBytes(); // Swap upper and lower case letters. for (int i = 0; i < bytes.length; i++) { if(bytes[i] >= 'A' && bytes[i] <= 'Z') bytes[i] = (byte)( 'a' + (bytes[i] - 'A')); else if(bytes[i] >= 'a' && bytes[i] <= 'z') bytes[i] = (byte)( 'A' + (bytes[i] - 'a')); } // Assign back to string. base64EncodedPublicKey = new String( bytes );
таким образом, идея заключалась бы в том, чтобы поместить свой оригинальный ключ в качестве
base64EncodedPublicKey
и запустите приведенный выше код, он поменяет нижние и верхние буквы и вернет результат вbase64EncodedPublicKey
. Затем вы можете скопировать результат из отладчика и вставить его в код как исходныйbase64EncodedPublicKey
значение. В этот момент ваш ключ будет преобразован (верхний и нижний регистр переключается), и во время выполнения он исправит его обратно в правильный корпус, и продолжать работать.выше, очевидно, довольно простой транскод, но вы можете быть более творческими, изменить порядок A-Z, поменять нечетные и четные числа, поменять гласные на четные числа. Проблема здесь в том, что если я помещаю код в приведенный выше фрагмент, который делает кучу более интересных транскодов, а затем все копируют и вставляют это в свои проекты, взломщик легко сможет увидеть и использовать сам транскод (от просмотра этого сообщения)! Так что вам просто нужно придумать несколько трансформирует себя.
Я намеренно сделал вышеуказанную работу в обоих направлениях (поэтому, если вы запустите ее дважды, вы получите свое исходное значение обратно), поскольку это упрощает запуск алгоритма на вашем исходном ключе. Я думаю, что это довольно аккуратно, похоже, что настоящий ключ сидит там как обычный текст, случайный взломщик может попытаться переключить это, а затем запутаться, когда он не работает.
вы можете разделить его на части, как это
String piece1 = "SDFGJKGB4UIH234WE/FRT23RSDF/3DFUISDFVWE"; String piece2 = "SDFGJKGB4UIHUISDFVWE"; String piece3 = "BDYASGBDNAWGRET24IYE23das4saGBENWKD"; String piece4 = "432423SDF23R/+SDDS"; mHelper = new IabHelper(this, piece1 + piece2 + piece3 + piece4);
любые манипуляции будут делать.
вы не можете полностью скрыть открытый ключ от злоумышленника, вам просто нужно манипулировать строкой, чтобы немного запутать злоумышленника
вы можете добавить некоторые строки и удалить его, когда это необходимо или разделить его на куски.
то, что я сделал, это преобразовать ключ в массив символов, разделить его на две части, а затем восстановить его при необходимости следующим образом:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shop); char[] base64KeyByteArray = ArrayUtils.addAll(getPublicKeyChunk1(), getPublicKeyChunk2()); Log.d(TAG, String.valueOf(base64KeyByteArray)); } private char[] getPublicKeyChunk1() { return new char[]{82, 73, 67, 66, 73, 106, 65, 78, 66, 103, 107, 113, 104, 107, 105, 71, 57, 119, 79, 66, 65, 81, 69, 70, 65, 65, 79, 67, 65, 81, 56, 65, 77, 73, 73, 66, 67, 103, 75, 67, 65, 81, 69, 65, 121, 55, 81, 76, 122, 67, 105, 80, 65, 110, 105, 101, 72, 66, 53, 57}; } private char[] getPublicKeyChunk2() { return new char[]{82, 43, 68, 47, 79, 121, 122, 110, 85, 67, 118, 89, 108, 120, 43, 49, 80, 100, 67, 108, 55, 90, 57, 103, 119, 57, 87, 78, 79, 111, 53, 101, 80, 71, 117, 74, 104, 82, 87, 97, 100}; }
выполните 3 простых шага, чтобы защитить API / секретный ключ
мы можем использовать Gradle для защиты ключа API или секретного ключа. Проверьте мой ответ.