Android - 更安全地保存静态密钥,android 三种开发模式
密钥存储方案
在日常开发中,推荐运用若干种方案拼接起完整的密钥。
在下面的案例
中,我将运用以下方式输出密钥各部分内容(后面会逐个讲解)
Java 硬编码
gradle 配置
特殊的算法
利用 strings.xml
现在假设我们需要进行 AES 加解密,按要求来定义一个密钥,密钥的形式可能是这样的:
String AES_KEY = "1234567890!@#$%^";//硬编码方式定义 AES 密钥
是不是已经有同学看不下去了。。。
好吧,更好的方式是这样的:
String AES_KEY = ProjectUtil.getAESKeyPart1(3, 4)//根据自定义算法输出密钥第 1 部分
BuildConfig.AES_KEY_PART2//根据 gradle 配置输出密钥第 2 部分
CommonUtil.getString(R.string.AES_KEY_PART3)//根据 string.xml 输出密钥第 3 部分
MyConstant.AES_KEY_PART4;//根据硬编码方式输出密钥第 4 部分
String AES_KEY_PART4 = "!@#$%^";
怎么样?是不是瞬间感觉难懂了一些,下面就来逐一讲解。
第一部分:ProjectUtil.getAESKeyPart1(3, 4)
这部分很好说,这里我自定义了一个算法,用以迷惑“有缘人”
public static int getAESKeyPart1(int x, int y) {
for (int i = 1; i <= x * y; i++) {
if (i % x == 0 && i % y == 0)
return i;
}
return x * y;
}
我这里定义的算法主要输出的是数字,在实际开发中你也可以定义一些类似的算法。
第二部分:BuildConfig.AES_KEY_PART2
这里主要是通过 gradle 的配置来自动生成 AES_KEY_PART2 这个常量。具体操作如下:
打开 Module 下的 build.gradle 文件,在 android 标签下的 buildTypes 下添加配置。
buildTypes {
release {
buildConfigField "boolean", "LOG_DEBUG", "true"//显示 Log
buildConfigField "String", "AES_KEY_PART2", ""3456""
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
buildConfigField "boolean", "LOG_DEBUG", "false"//不显示 Log
buildConfigField "String", "AES_KEY_PART2", ""3456""
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
如上所见,我使用 buildConfigField 关键字添加了 LOG_DEBUG 和 AES_KEY_PART2 两个字段。LOG_DEBUG 用以控制是否输出并显示 Log。在添加完配置之后,就可以 Rebuild 项目了,然后你就可以打开自动生成的 BuildConfig 类,这时候你添加的常量就在此类当中了。
public final class BuildConfig {
// ...
public static final String AES_KEY_PART2 = "3456";
public static final boolean LOG_DEBUG = false;
}
需要注意的是,在定义字符串(尤其是数字字符串)的时候,一定要定义成:
评论