java如何安全保存密钥_Android本地安全地保存密钥

以下方法是邪门歪路,具体需要用到AndroidKeyStore来获取AES的密钥或者RSA的公钥和私鈅
Cipher,KeyGenParameterSpec
gradle配置 + 静态代码 + 字符串运算 + string.xml
首先将静态秘钥分为四部分:
?第一部分通过gradle配置的方式存储;
?第二部分通过java硬编码的方式存储;
?第三部分通过java字符串拼接运算的方式存储;
?第四部分通过string.xml保存;
获取appKey第一部分字符串:
通过gradle配置的方式我们上面已经做了介绍,其就是在mudle中的gradle文件中再起buildType节点下定义字符串变量,这里需要注意的是若是有正式环境和测试环境之分,需要分别定义字符串变量,这样我们就可以通过BuildConfig获取appKay第一部分的字符串了。
/**
获取AppKey part1
【java如何安全保存密钥_Android本地安全地保存密钥】*/
public static String getBK1() {
return BuildConfig.appKey;
}
获取appKey第二部分字符串:
第二部分的appKay字符串是通过运算的出来的,这里的运算可以是任意运算方式,越复杂越好,越让人看不懂越好,当然结果需要时唯一的。比如:
public static StringBuffer getBk2() {
StringBuffer sb = new StringBuffer();
sb.append(Config.getGBS(2, 5));
return sb;
}
而这里的getGBS方法的实现:
public static int getGBS(int x, int y){
for(int i = 1; i<= x * y; i++){
if(i % x == 0 && i % y == 0)
return i;
}
return x * y;
}
最终的结果返回是:10,当然了不同的字符串需要不同的算法;
获取appKey第三部分字符串:
这里就只是使用了简单的字符串硬编码
public static String getBK3() {
return "xhxh";
}
获取appKey第四部分字符串
?在string.xml中定义appKey的第四部分
chs1
?在代码中获取string中定义的字符串值
public static String getBk4() {
mContext().getResources().getString(R.string.bk4);
}
获取最终的appKey字符串:
/**
获取最终的appKey字符串
*/
public static byte[] getDefaultKey() {
StringBuffer sb = new StringBuffer();
sb.append(getBK1()).append(getBK2()).append(getBk3()).append(getBk4());
return sb.toString();
}
这样经过一系列的操作之后我们就获取到了最终的静态秘钥。当然了产品中最好实现了代码混淆的功能,这样也能增大逆向的难度。
总结:
?在App端保存静态秘钥可以通过SharedPreferences、java硬编码,ndk中的so文件,文件,数据库,gradle配置的方式实现;
?为了保证秘钥的安全性可以采用多种方式混合,这样可以增加恶意反编译的难度;
?在App端保存秘钥不能真正的保证秘钥的安全性,只能增加反编译的难易程度;
?可以使用gradle配置的方式配置静态秘钥,使用string.xml配置秘钥增加逆向反编译的难度;
?不推荐使用文件,数据库的方式保存静态秘钥,容易被用户恶意删除,而出现不可预知的错误;

    推荐阅读