在实际的项目开发中,经常会用到一些第三方的 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 文件。例如配置

# 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

微信关注我们,可以获取更多


在 Android 中如何优雅地配置私密信息的更多相关文章

  1. Android中获取系统上安装的APP信息

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003259 Android中获取系统上安装的APP信 ...

  2. Android中Tomcat的简单配置和使用

    因为学Android已经有一段时间了,但是在学校,服务器方面是个短板啊,没有专门的服务器拿给我们学生练手,所以只有自己找办法了.当然,Tomcat就是不二的选择了. 在网上看了看资料,还是觉得自己记录 ...

  3. Android中的测试类配置AndroidManifest.xml

    测试类至于要把一个类继承ActivityTestCase即可至于方法,根据需要自己建立方法:之后必须配置AnroidMainfest.xml文件 配置AndroidManifest.xml文件 1) ...

  4. android中使用jni对字符串加解密实现分析

    android中使用jni对字符串加解密实现分析 近期项目有个需求.就是要对用户的敏感信息进行加密处理,比方用户的账户password,手机号等私密信息.在java中,就对字符串的加解密我们能够使用A ...

  5. fabric私密数据学习笔记

    fabric私密数据学习笔记 私密数据分为两部分 一个是真正的key,value,它被存在 peer的私密数据库(private state)中. 另一部分为公共数据,它是真实的私密数据key,val ...

  6. 菜鸟系列Fabric——Fabric 私密数据(6)

    Fabric 私密数据 1.私密数据的定义 如果某个渠道上的一组组织需要将数据与该渠道上的其他组织保密,他们可以选择创建一个仅包含需要访问数据的组织的新渠道.但是,在每种情况下创建单独的通道会产生额外 ...

  7. 在android中配置 slf4j + log4j 日志记录框架

    需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...

  8. 5、xamarin.android 中如何对AndroidManifest.xml 进行配置和调整

    降低学习成本是每个.NET传教士义务与责任. 建立生态,保护生态,见者有份. 我们在翻看一些java的源码经常会说我们要在AndroidManifest.xml 中添加一些东西.而我们使用xamari ...

  9. Android中如何像 360 一样优雅的杀死后台服务而不启动

    Android中,虽然有很多方法(API或者shell命令)杀死后台`service`,但是仍然有很多程序几秒内再次启动,导致无法真正的杀死.这里主要着重介绍如何像 360 一样杀死Android后台 ...

随机推荐

  1. Chrome浏览器扩展开发系列之十二:Content Scripts

    Content Scripts是运行在Web页面的上下文的JavaScript文件.通过标准的DOM,Content Scripts 可以操作(读取并修改)浏览器当前访问的Web页面的内容. Cont ...

  2. html之结构化标记

    1.什么是结构化标记 对布局使用的div 进行升级 , 根据页面的不同区域而提供的不同标签.作用与div几乎一致 专门用于搭建网站结构而用 2.结构标记详解 1.<header>元素 作用 ...

  3. Kinect 常用识别手势

    以下手势能被流畅的识别: ◎RaiseRightHand / RaiseLeftHand – 左手或右手举起过肩并保持至少一秒 ◎Psi –双手举起过肩并保持至少一秒 ◎Stop – 双手下垂. ◎W ...

  4. css 2D转换 transform-rotate 画插图

    学习了一点2D转换,关于Transfrom-rotate的小用法 rotate()方法,在一个给定度数顺时针旋转的元素.负值是允许的,这样是元素逆时针旋转. 下面看实例 第一个例子是没有使用rotat ...

  5. webpack热更新问题和antd design字体图标库扩展

    标题也不知道怎么写好,真是尴尬.不过话说回来,距离上一次写文快两个月了,最近有点忙,一直在开发新项目, 今天刚刚闲下来,项目准备提测.借这个功夫写点东西,把新项目上学到的一些好的干活分享一下,以便之后 ...

  6. 设计模式的征途—14.职责链(Chain of Responsibility)模式

    相信大家都玩过类似于“斗地主”的纸牌游戏,某人出牌给他的下家,下家看看手中的牌,如果要不起,则将出牌请求转发给他的下家,其下家再进行判断.一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新 ...

  7. 第2章 rsync(二):inotify+rsync详细说明和sersync

    本文目录: inotify+rsync 1.1 安装inotify-tools 1.2 inotifywait命令以及事件分析 1.3 inotify应该装在哪里 1.4 inotify+rsync示 ...

  8. java.net.UnknownHostException 异常解决方案

    1)使用hostname命令设置新的host name与/etc/hosts本机hostname一致 #hostname 本机hostname 具体可以查看:/etc/hosts和//etc/sysc ...

  9. tensorflow softsign函数应用

    1.softsign函数 图像 2.tensorflow softsign应用 import tensorflow as tf input=tf.constant([0,-1,2,-30,30],dt ...

  10. python函数(2):函数进阶

    昨天说了函数的一些最基本的定义,今天我们继续研究函数.今天主要研究的是函数的命名空间.作用域.函数名的本质.闭包等等 预习: 1.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的 ...