天天看點

在 Android 中如何優雅地配置私密資訊

在實際的項目開發中,經常會用到一些第三方的 SDK ,而使用這些 SDK 基本上都是需要配置 APPKEY 或 APPSECRET 等資訊。此外 APP 打包時需要 KEYSTORE , STOREPASSWORD的資訊。這些都是私密配置資訊,不應該釋出到 Github 或其它公共空間。

一般來說有以下幾種方式

  1. 寫在 string 資源檔案中
  2. 配置在 BuildConfig 類中
  3. 使用 Android 密鑰庫系統
  4. 使用 NDK 加密
  5. 儲存在服務端,通過接口擷取

直接寫死肯定不是最好的方式,隻要代碼上傳就會分享到各個地方。最好的方式是當然是儲存在服務端,在需要的時候進行擷取。

使用 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


[email protected]      

這個檔案資訊定義打包 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 檔案。

使用 gradle 方式安全性是最弱的。

Android 密鑰庫系統可以保護密鑰材料免遭未經授權的使用。首先,Android 密鑰庫可以防止從應用程序和 Android 裝置中整體提取密鑰材料,進而避免了在 Android 裝置之外以未經授權的方式使用密鑰材料。其次,Android 密鑰庫可以讓應用指定密鑰的授權使用方式,并在應用程序之外強制實施這些限制,進而避免了在 Android 裝置上以未經授權的方式使用密鑰材料。

這個是 Google 自家提供的 API, 但它隻在 Android 4.3 以後的系統中才引用,故此方案有一定的限制。

可以将加密算法封裝在 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

微信關注我們,可以擷取更多      
在 Android 中如何優雅地配置私密資訊