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

以下方法是邪门歪路,具体需要用到AndroidKeyStore来获取AES的密钥或者RSA的公钥和私鈅

Cipher,KeyGenParameterSpec

gradle配置 + 静态代码 + 字符串运算 + string.xml

首先将静态秘钥分为四部分:

•第一部分通过gradle配置的方式存储;

•第二部分通过java硬编码的方式存储;

•第三部分通过java字符串拼接运算的方式存储;

•第四部分通过string.xml保存;

获取appKey第一部分字符串:

通过gradle配置的方式我们上面已经做了介绍,其就是在mudle中的gradle文件中再起buildType节点下定义字符串变量,这里需要注意的是若是有正式环境和测试环境之分,需要分别定义字符串变量,这样我们就可以通过BuildConfig获取appKay第一部分的字符串了。

/**

获取AppKey part1

*/

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配置秘钥增加逆向反编译的难度;

•不推荐使用文件,数据库的方式保存静态秘钥,容易被用户恶意删除,而出现不可预知的错误;

你可能感兴趣的:(java如何安全保存密钥)