在實際的項目開發中,經常會用到一些第三方的 SDK ,而使用這些 SDK 基本上都是需要配置 APPKEY 或 APPSECRET 等信息。此外 APP 打包時需要 KEYSTORE , STOREPASSWORD的信息。這些都是私密配置信息,不應該發布到 Github 或其它公共空間。
一般來說有以下幾種方式
-
寫在 string 資源文件中
-
配置在 BuildConfig 類中
-
使用 Android 密鑰庫系統
-
使用 NDK 加密
-
保存在服務端,通過接口獲取
直接硬編碼肯定不是最好的方式,只要代碼上傳就會分享到各個地方。最好的方式是當然是保存在服務端,在需要的時候進行獲取。
使用 Gradle 配置文件
首先介紹一種簡單方式在 gradle 種配置 string 資源和常量的方式。而不是直接在 string 文件中硬編碼。
gradle.properties
首先在 Project 的目錄下創建一個 gradle.properties 文件。例如配置
# Project-wide Gradle settings. ... # org.gradle.parallel=true KEY_STORE=../xxxx.keystore KEY_ALIATS=這里是別名 KEY_PASSWORD=這里是keypassword的密碼 STORE_PASSWORD=這里是store的密碼 APP_KEY=第三方sdk app key APP_SECRET=第三方sdk app secret APP_USER=wecodexyz@gmai.com
這個文件信息定義打包 keystore 密碼和 App Key 等信息。
build.gradle
在 app 目錄下的 build.gradle 文件中對 keystore 和 APP_KEY 等信息進行了配置。
android { compileSdkVersion 25 buildToolsVersion "25.0.2" signingConfigs { config { storeFile file(KEY_STORE) keyAlias KEY_ALIATS keyPassword KEY_PASSWORD storePassword KEY_PASSWORD } debug { storeFile file(KEY_STORE) keyAlias KEY_ALIATS keyPassword KEY_PASSWORD storePassword KEY_PASSWORD } } defaultConfig { } release { //這里配置String常量,可以用BuildConfig類引用 buildConfigField "String", "APP_USER", "\"${APP_USER}\"" //這里配置string資源,使用@string可以在manifest等文件中引用 resValue "string", "app_key", "${APP_KEY}" resValue "string", "app_secret", "${APP_SECRET}" } debug { //這里配置String常量,可以用BuildConfig類引用 buildConfigField "String", "APP_USER", "\"${APP_USER}\"" //這里配置string資源,使用@string可以在manifest等文件中引用 resValue "string", "app_key", "${APP_KEY}" resValue "string", "app_secret", "${APP_SECRET}" } }
最后最關鍵的一點是
要在 .gitignore 文件中忽略 gradle.properties 文件。
要在 .gitignore 文件中忽略 gradle.properties 文件。
要在 .gitignore 文件中忽略 gradle.properties 文件。
使用 gradle 方式安全性是最弱的。
使用 Android 密鑰庫系統
Android 密鑰庫系統可以保護密鑰材料免遭未經授權的使用。首先,Android 密鑰庫可以防止從應用進程和 Android 設備中整體提取密鑰材料,從而避免了在 Android 設備之外以未經授權的方式使用密鑰材料。其次,Android 密鑰庫可以讓應用指定密鑰的授權使用方式,並在應用進程之外強制實施這些限制,從而避免了在 Android 設備上以未經授權的方式使用密鑰材料。
這個是 Google 自家提供的 API, 但它只在 Android 4.3 以后的系統中才引用,故此方案有一定的限制。
使用 NDK 加密
可以將加密算法封裝在 NDK 中,在一定程度上增加了破解的難度。而且可以不受 API Level 的限制。
保存在服務端,通過接口獲取
對於一些安全性要求比較高的 APP 來說,是推薦使用這種方式的。同時接口要使用 Https 協議。
那么當通過接口獲取到私密信息如何保存呢?這時候可以使用 NDK 或者 Android 密鑰庫系統。
參考文獻
https://guides.codepath.com/android/Storing-Secret-Keys-in-Android
https://developer.android.com/training/articles/keystore.html
微信關注我們,可以獲取更多