Android - 更安全地保存静态密钥(1)

在日常开发中我们经常需要保存一些私密的信息,例如加解密的密钥等等。这时候我们就要来考虑如何存储密钥了。先来简单介绍几种存储方式:

  • Java硬编码方式

  • SharedPreferences存储

  • 文件存储

  • 数据库存储

以上几种存储方式是很不安全的,例如采用硬编码方式存储,程序包很容易被反编译获取到密钥。SharedPreferences、文件和数据库又有可能因为用户的误删操作而丢失密钥,所以一般很少存储到这一类的文件中。那么问题来了,我们应该用什么方式来确保密钥的存储相对更安全呢?

密钥存储方案

在日常开发中,推荐运用若干种方案拼接起完整的密钥。

在下面的案例中,我将运用以下方式输出密钥各部分内容(后面会逐个讲解)

  • 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;

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值