在 Android 中如何優雅地配置私密信息

在實際的項目開發中,常常會用到一些第三方的 SDK ,而使用這些 SDK 基本上都是須要配置 APPKEYAPPSECRET 等信息。此外 APP 打包時須要 KEYSTORE , STOREPASSWORD的信息。這些都是私密配置信息,不該該發佈到 Github 或其它公共空間。html

通常來講有如下幾種方式android

  1. 寫在 string 資源文件中git

  2. 配置在 BuildConfig 類中算法

  3. 使用 Android 密鑰庫系統安全

  4. 使用 NDK 加密微信

  5. 保存在服務端,經過接口獲取app

直接硬編碼確定不是最好的方式,只要代碼上傳就會分享到各個地方。最好的方式是固然是保存在服務端,在須要的時候進行獲取。ide

使用 Gradle 配置文件

首先介紹一種簡單方式在 gradle 種配置 string 資源和常量的方式。而不是直接在 string 文件中硬編碼。gradle

gradle.properties

首先在 Project 的目錄下建立一個 gradle.properties 文件。例如配置ui

# 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

微信關注咱們,能夠獲取更多

相關文章
相關標籤/搜索