Protecting secrets in an Android project — статья о том, как правильно хранить секреты, например ключи API, в своем приложении.
Все секретные строки лучше вынести в отдельный файл, который хранится вне системы контроля версий. Это позволит избежать недоразумений, когда разработчик заливает код в открытый репозиторий и таким образом выставляет ключи на всеобщее обозрение. Также такой подход позволяет расшаривать ключи между несколькими приложениями. Секреты можно хранить, например, в файле ~/.gradle/gradle.properties:
1 2 3 |
GameCatalogueApp_UploadKeystore_KeyPassword=aaaabbbbcccc GameCatalogueApp_AuthClientSecret=123456789 GameCatalogueApp_Pusher_APIKey=ksldjalksdjskald |
Чтобы сделать их доступными в исходном коде, можно использовать приблизительно такой трюк (пример для скрипта Gradle на Kotlin):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
defaultConfig { buildConfigField( "String", "AUTH_CLIENT_SECRET", buildConfigProperty("GameCatalogueApp_AuthClientSecret") ) resValue( "string", "pusher_key", propertyOrEmpty("GameCatalogueApp_Pusher_APIKey") ) } fun Project.buildConfigProperty(name: String) = "\"${propertyOrEmpty(name)}\"" |
Чтобы защитить секреты не только от утечек, но и от реверса приложения, их стоит зашифровать. Для этого необходимо поместить ключи в конфиг Gradle уже в зашифрованной форме и расшифровывать их с помощью ключа, тоже записанного в конфиг Gradle. Чтобы затруднить жизнь взломщику, ключ можно обфусцировать. Например, добавить к нему случайные данные или перемешать части ключа и уже в коде приложения привести его в нужный вид.
РЕКОМЕНДУЕМ:
Хорошие и плохие приемы программирования на Kotlin
На этом все. Как видите, защита API мобильного приложения от несанкционированного доступа штука совсем не сложная.