Android: uso del NDK para ocultar claves API en bibliotecas nativas | Autor: Sanjay Kakadia | My Robot | Junio de 2021
Si está leyendo este blog, debe ser un gran desarrollador de Android, de lo contrario, se convertirá en uno en el futuro. Como desarrolladores de Android, creamos aplicaciones de Android y usamos varias bibliotecas de terceros (herramientas SDK) porque no podemos desarrollar todo nosotros mismos.
Por lo general, su aplicación tendrá credenciales secretas o claves de API, debe usar esta información en la aplicación para ejecutarla, pero no desea extraer fácilmente esta información de la aplicación.
Para almacenar claves de API fijas, existen las siguientes estrategias comunes para almacenar secretos en el código fuente:
- Oculto en BuildConfig
- Insertar archivo de recursos
- Utilice Proguard para la ofuscación
- Cadena disfrazada o encriptada
- Use NDK para esconderse en la biblioteca nativa
- Oculto como constantes en el código fuente
Este proceso no es a prueba de balas. Como recursos, son más susceptibles a la descompilación de paquetes de aplicaciones, por lo que si alguien realmente quiere comprenderlos, pueden ser descubiertos. Sin embargo, esta solución evita que sus secretos se almacenen en la administración de código fuente en texto plano para que alguien los use, y tiene las ventajas de ser fácil de usar, utilizar el sistema de administración de recursos de Android y no requerir bibliotecas adicionales.
sin emabargo, Ninguna de estas estrategias garantiza la protección de sus claves. Y tus secretos no están a salvo. La mejor forma de proteger los secretos es no revelarlos nunca en el código. Separar la información confidencial y las operaciones en sus propios servidores / servicios back-end siempre debe ser su primera opción.
Si realmente tiene que considerar soluciones ocultas, debe tener en cuenta que hacerlo solo dificultará el proceso de ingeniería inversa y puede traer una complejidad significativa al desarrollo, las pruebas y el mantenimiento de su aplicación. Consulte esta excelente publicación de StackOverflow para obtener más información sobre las opciones de ofuscación disponibles.
Si revela sus secretos al viento, no debe culpar a Feng Xiangshu por revelar sus secretos. ~Gibran
Antes de comenzar, comience desde Herramientas> Administrador de SDK> Herramientas de SDK. Haga clic en Solicitud Después de descargar e instalar, haga clic en OK.
Ahora que hemos terminado de descargar la herramienta, continuemos rápidamente usando el NDK para proteger la clave API.
Para compilar el código nativo en el proyecto, Android Studio admite ndk-build. Aquí tendrás un Android.mk Archivo de compilación utilizado ndk-build.
Esto
Android.mk
El archivo reside en un subdirectorio del proyecto.jni/
Catalogue y describa su código fuente y bibliotecas compartidas en el sistema de compilación. En realidad, es un pequeño fragmento de archivo MAKE GNU que el sistema de compilación analiza una o más veces.EstoAndroid.mk
Los archivos son útiles para definir la configuración del alcance del proyectoApplication.mk
, El sistema de compilación y las variables de entorno no están definidas.También puede anular la configuración de un alcance de proyecto específico. Módulo.
Siga los pasos a continuación para usar ndk-build:
paso 1: debajo Aplicación / código fuente / principal Directorio, cree un archivo llamado Jenny. Aquí tendremos nuestro .mk Archivos y archivos de código nativo.
Paso 2: adentro Jenny En el directorio creado en el paso anterior, agregue un archivo llamado Android.mk Y agregue las siguientes líneas de código:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := app-keys
LOCAL_SRC_FILES := app-keys.c
include $(BUILD_SHARED_LIBRARY)
Explicación del código anterior:
- La variable LOCAL_PATH indica la ubicación del archivo fuente. Mi catalogo Es una función macro proporcionada por el sistema de compilación para devolver el directorio actual.
- CLEAR_VARS se utiliza para borrar muchas variables LOCAL_XXX, como LOCAL_MODULE, LOCAL_SRC_FILES, etc. No borrará LOCAL_PATH.
- La variable LOCAL_MODULE almacena el nombre del módulo que desea construir. El nombre del módulo debe ser único y no se deben utilizar espacios en el nombre del módulo.
- La variable LOCAL_SRC_FILES contiene una lista de archivos C o C ++ presentes en el módulo.
- La variable BUILD_SHARED_LIBRARY se usa para unir todo. Determina qué construir y cómo hacerlo.Recopila la información que definió en la variable LOCAL_XXX desde la última vez incluir.
tercer paso: adentro Jenny Directorio y crea otro con nombre Application.mk Archiva y agrega el siguiente código:
APP_ABI := all
Esto Application.mk El archivo se utiliza para especificar la configuración de todo el proyecto para ndk-build.
La variable APP_ABI se utiliza para especificar la ABI cuyo código debe generar el sistema de compilación. De forma predeterminada, el sistema de compilación genera código para todas las ABI que no están en desuso.
el cuarto paso: El último archivo se agrega a Jenny El directorio es su archivo de código nativo.Por lo tanto, en el directorio jni, agregue un archivo llamado app-keys.c Y agregue el siguiente código:
#include <jni.h> //For first API key JNIEXPORT jstring JNICALL Java_com_myapplication_APILib_getAPIKey(JNIEnv *env, jobject instance)
return (*env)-> NewStringUTF(env, "YOUR_API_KEY");
el quinto paso: Después de agregar los archivos requeridos en su archivo Jenny Directorio, nuestro próximo objetivo es brindar nuestro camino Android.mk Presentar en Construir .gradle expediente.
android
…
defaultConfig
…
buildTypes
…
externalNativeBuild
ndkBuild
path ‘src/main/jni/Android.mk’
El sexto paso: Ahora, para usar su clave API en un evento o cualquier archivo, vaya al evento o archivo donde desea usar la clave API.Para cargar el código nativo que escribió, debe llamar System.loadLibrary («Biblioteca nativa») El método en el bloque init.
init
System.loadLibrary("native-lib")
El séptimo paso: Ahora, declare una función externa de Kotlin con el mismo nombre que la utilizada en el código nativo.
external fun getAPIKey(): String
El octavo paso: Finalmente, puede obtener la clave API llamando a:
APILib.getAPIKey()
¡eso es todo! Has asegurado tu clave API 🙂
Si te gusta este artículo, dame algunos Aplaude Y sígueme para más publicaciones similares. Si tiene alguna idea o pregunta, asegúrese de comentar.