前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在 Android 中如何优雅地配置私密信息

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

作者头像
阳仔
发布2019-07-31 17:35:19
1.7K0
发布2019-07-31 17:35:19
举报
文章被收录于专栏:终身开发者

在实际的项目开发中,经常会用到一些第三方的 SDK ,而使用这些 SDK 基本上都是需要配置 APPKEYAPPSECRET 等信息。此外 APP 打包时需要 KEYSTORE , STOREPASSWORD 的信息。这些都是私密配置信息,不应该发布到 Github 或其它公共空间。

一般来说有以下几种方式

  1. 写在 string 资源文件中
  2. 配置在 BuildConfig 类中
  3. 使用 Android 密钥库系统
  4. 使用 NDK 加密
  5. 保存在服务端,通过接口获取

直接硬编码肯定不是最好的方式,只要代码上传就会分享到各个地方。最好的方式是当然是保存在服务端,在需要的时候进行获取。

使用 Gradle 配置文件

首先介绍一种简单方式在 gradle 种配置 string 资源和常量的方式。而不是直接在 string 文件中硬编码。

gradle.properties

首先在 Project 的目录下创建一个 gradle.properties 文件。例如配置

代码语言:javascript
复制
# 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 等信息进行了配置。

代码语言:javascript
复制
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

鼓励我

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 终身开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用 Gradle 配置文件
    • gradle.properties
      • build.gradle
      • 使用 Android 密钥库系统
      • 使用 NDK 加密
      • 保存在服务端,通过接口获取
      • 参考文献
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档