在实际的项目开发中,常常会用到一些第三方的 SDK ,而使用这些 SDK 基本上都是须要配置 APPKEY 或 APPSECRET 等信息。此外 APP 打包时须要 KEYSTORE , STOREPASSWORD的信息。这些都是私密配置信息,不该该发布到 Github 或其它公共空间。html
通常来讲有如下几种方式android
写在 string 资源文件中git
配置在 BuildConfig 类中算法
使用 Android 密钥库系统安全
使用 NDK 加密微信
保存在服务端,经过接口获取app
直接硬编码确定不是最好的方式,只要代码上传就会分享到各个地方。最好的方式是固然是保存在服务端,在须要的时候进行获取。ide
首先介绍一种简单方式在 gradle 种配置 string 资源和常量的方式。而不是直接在 string 文件中硬编码。gradle
首先在 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 等信息。
在 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 设备上以未经受权的方式使用密钥材料。
这个是 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
微信关注咱们,能够获取更多