Android应用安全开发之浅谈密钥硬编码


作者:伊樵、呆狐@阿里聚安全
1 简介

在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码、文件中,这样做会引起很大风险。信息安全的基础在于密码学,而常用的密码学算法都是公开的,加密内容的保密依靠的是密钥的保密,密钥如果泄露,对于对称密码算法,根据用到的密钥算法和加密后的密文,很容易得到加密前的明文;对于非对称密码算法或者签名算法,根据密钥和要加密的明文,很容易获得计算出签名值,从而伪造签名。


2 风险案例

密钥硬编码在代码中,而根据密钥的用途不同,这导致了不同的安全风险,有的导致加密数据被破解,数据不再保密,有的导致和服务器通信的加签被破解,引发各种血案,以下借用乌云上已公布的几个APP漏洞来讲讲

2.1 某互联网金融APP加密算法被破解导致敏感信息泄露

某P2P应用客户端,用来加密数据的DES算法的密钥硬编码在Java代码中,而DES算法是对称密码算法,既加密密钥和解密密钥相同。 
反编译APP,发现DES算法:

发现DES算法的密钥,硬编码为“yrdAppKe”,用来加密手势密码:

将手势密码用DES加密后存放在本地LocusPassWordView.xml文件中:

知道了密文和加密算法以及密钥,通过解密操作,可以从文件中恢复出原始的手势密码。或者使用新的生成新的手势密码

而与服务器通信时接口中的Jason字段也用了DES算法和密钥硬编码为“yRdappKY”:

和服务器通信采用http传输,没有使用https来加密通信,如果采用中间人攻击或者路由器镜像,获得流量数据,可以破解出用户的通信内容。

2.2 某租车APP加密算法被破解导致一系列风险

某租车APP与服务器通信的接口采用http传输数据,并且有对传输的部分参数进行了加密,加密算法采用AES,但是密钥硬编码在java代码中为“shenzhoucar123123”,可被逆向分析出来,导致伪造请求,结合服务器端的漏洞,引起越权访问的风险,如越权查看其它用户的订单等。 
和服务器通信时的数据为:

q字段是加密后的内容。逆向APP,从登录Activity入手:

分析登录流程:v1是用户名,v2是密码,v3是PushId,在用户名和密码不为空并且长度不小于11情况下,执行LoginOperate相关操作,追踪LoginOperate的实现,发现继承自BaseOperate,继续追踪BaseOperate的实现:

在BaseOperate的initUrl()方法中,找到了APP是怎么生成请求数据的:

继续追踪上图中的initJsonUrl()方法,发现其调用了AES加密:

继续追踪aes.onEncrypt()函数:

在onEncrypt()函数中调用了encrypt()函数用来加密数据,追踪encrypt()函数的实现,发现其使用AES算法,并且密钥硬编码在java代码中为“shenzhoucar123123”

到现在请求中的数据加密如何实现的就清晰了,另外由于服务器权限控制不严,就可以构造订单id的请求,达到越权访问到其他用户的订单。 
构造{“id”:”11468061”}的请求:

其中uid设置为你自己的uid即可,可以成功看到其他人的订单:

攻击者完全可以做到使用其他脚本重新实现相同的加密功能并拼接出各个接口请求,批量的刷取订单信息和用户其他信息。

2.3 某酒店APP加签算法被破解导致一系列风险

某酒店APP和服务器通信时接口采用http通信,数据进行了加密,并且对传输参数进行签名,在服务器端校验签名,以检查传输的数据是否被篡改,但是加签算法和密钥被逆向分析,可导致加签机制失效,攻击者可任意伪造请求包,若结合服务器端的权限控制有漏洞,则可引发越权风险等。

APP和服务器通信的原始包如下图,可以看到有加签字段sign:

逆向APP定位到加密算法的逻辑代码,com.htinns.biz.HttpUtils.class,其实现逻辑为:

原始数据是unSignData,使用RC4算法加密,密钥为KEY变量所代表的值,加密后的数据为signData,传输的数据时的data字段为signData。 
加签字段signd的生成方法是用unsignData拼接时间戳time和resultkey,然后做md5,再进行base64编码。时间戳保证了每次请求包都不一样。 
sendSign()算法是用c或c++写的,放入了so库,其他重要算法都是用java写的。 
可以使用IDA逆向分析so库,找到sendSign()方法

而乌云漏洞提交者采用的是分析sign和getSign(sign)的数据,做一个算法破解字典。其实还有种方法直接调用此so库,来生成字典。

签名破解以后,就可以构造发送给服务器的数据包进行其他方面的安全测试,比如越权、重置密码等。


3 阿里聚安全开发建议

通过以上案例,并总结下自己平时发现密钥硬编码的主要形式有:

1、密钥直接明文存在sharedprefs文件中,这是最不安全的。 
2、密钥直接硬编码在Java代码中,这很不安全,dex文件很容易被逆向成java代码。 
3、将密钥分成不同的几段,有的存储在文件中、有的存储在代码中,最后将他们拼接起来,可以将整个操作写的很复杂,这因为还是在java层,逆向者只要花点时间,也很容易被逆向。 
4、用ndk开发,将密钥放在so文件,加密解密操作都在so文件里,这从一定程度上提高了的安全性,挡住了一些逆向者,但是有经验的逆向者还是会使用IDA破解的。 
5、在so文件中不存储密钥,so文件中对密钥进行加解密操作,将密钥加密后的密钥命名为其他普通文件,存放在assets目录下或者其他目录下,接着在so文件里面添加无关代码(花指令),虽然可以增加静态分析难度,但是可以使用动态调式的方法,追踪加密解密函数,也可以查找到密钥内容。

保证密钥的安全确是件难事,涉及到密钥分发,存储,失效回收,APP防反编译和防调试,还有风险评估。可以说在设备上安全存储密钥这个基本无解,只能选择增大攻击者的逆向成本,让攻击者知难而退。而要是普通开发者的话,做妥善保护密钥这些事情这需要耗费很大的心血。

产品设计者或者开发者要明白自己的密钥是做什么用的,重要程度怎么样,密钥被逆向出来会造成什么风险,通过评估APP应用的重要程度来选择相应的技术方案。

所以建议不妨试试阿里聚安全的安全加固和安全组件,其中安全组件中的安全加密功能提供了开发者密钥的安全管理与加密算法实现,保证密钥的安全性,实现安全的加解密操作;安全签名功能实现客户端请求的签名处理,保证客户端与服务端通信请求不被伪造。安全加固提升安全等级,防止应用被逆向破解。这样同时从应用层、运行层、native层提供多层次全方位立体防护,另外还有安全沙箱、白盒加密、底层加固共同保证客户端数据安全。攻防是不断变化演进的,阿里聚安全提供的服务能实时更新客户端模块,通过阿里聚安全的漏洞扫描来检测应用是否具有密钥硬编码风险,保证在攻防对抗中永远处于上风。

专业的事情交给专业的人来做,自己的主要精力用来做功能开发或者业务逻辑,快速打造能赢得市场的可靠产品才是王道。

参考

[1] http://www.wooyun.org/bugs/wooyun-2010-0187287 
[2] http://www.wooyun.org/bugs/wooyun-2010-0105766 
[3] http://www.wooyun.org/bugs/wooyun-2015-0162907 
[4] http://jaq.alibaba.com/safety?spm=a313e.7837752.1000001.1.zwCPfa

[5] https://www.zhihu.com/question/35136485/answer/84491440

作者:伊樵、呆狐@阿里聚安全,更多安全技术文章,请访问阿里聚安全博客


阿里聚安全由阿里巴巴移动安全部出品,面向企业和开发者提供企业安全解决方案,全面覆盖移动安全、数据风控、内容安全、实人认证等维度,并在业界率先提出“以业务为中心的安全”,赋能生态,与行业共享阿里巴巴集团多年沉淀的专业安全能力。

Android应用安全开发之浅谈密钥硬编码相关推荐

  1. Android安全开发之浅谈密钥硬编码

    Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...

  2. Android应用安全开发之浅谈加密算法的坑

    <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内容存 ...

  3. 【技术分享】Android应用安全开发之浅谈加密算法的坑

    <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题    Android开发中,难免会遇到需要加解密一些数据内容存到 ...

  4. Android 应用安全开发之浅谈加密算法

    android开发中,难免会遇到需要加解密一些数据内容存到本地文件.或者通过网络传输到其他服务器和设备的问题,但并不是使用了加密就绝对安全了,如果加密函数使用不正确,加密数据很容易受到逆向破解攻击.还 ...

  5. Android应用安全开发之浅谈网页打开APP

    一.网页打开APP简介 Android有一个特性,可以通过点击网页内的某个链接打开APP,或者在其他APP中通过点击某个链接打开另外一个APP(AppLink),一些用户量比较大的APP,已经通过发布 ...

  6. Android安全开发之浅谈加密算法的坑

    Android安全开发之浅谈加密算法的坑 作者:伊樵.舟海@阿里聚安全 Android开发中,难免会遇到需要加解密一些数据内容存到本地文件.或者通过网络传输到其他服务器和设备的问题,但并不是使用了加密 ...

  7. 应用安全开发之浅谈加密算法的坑

    转载自:http://www.cnblogs.com/alisecurity/p/5312083.html 1.需要了解的基本概念 密码学的三大作用:加密( Encryption).认证(Authen ...

  8. android应用前端,Android应用开发之浅谈移动前端适配

    本文将带你了解Android应用开发之浅谈移动前端适配,希望本文对大家学Android有所帮助 1. 什么是前端适配 从UI展现层面上: 我们期望不同尺寸的设备,页面可以自适应的展示或者进行等比缩放, ...

  9. 跨平台开发解决方案浅谈

    跨平台开发解决方案浅谈 前言 本文所讨论技术都是基于大前端生态下的 本文所指跨平台概念无特殊说明时泛指跨安卓和ios 用前端工程化技术开发出app也是本文所讲重点 作为用户来说,当然希望使用App的时 ...

最新文章

  1. Linux_正则表达式
  2. python【力扣LeetCode算法题库】914. 卡牌分组(reduce collections.Counter)
  3. Hibernate 之父:是时候升级到 Java EE 6 了!
  4. 四、启动OpenLDAP服务器
  5. Android之Launcher分析和修改5——HotSeat分析
  6. 使用ThreadPoolExecutor并行化独立的单线程任务
  7. 用java编写保留两位小数_Java保留两位小数的几种写法总结
  8. java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more
  9. java实体类中有枚举类型_当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?...
  10. Algorand基金会与Brixton Pound达成合作关系,将开发布里克斯顿英镑的通证化版本
  11. 2020-08-21 Qt+MSVC 强制中文UTF-8编码
  12. keil5破解失败【经验分享】
  13. SPSS学习资料汇总
  14. 微信聊天软件测试用例设计,微信页面测试用例_20140819
  15. 【Lv1-Lesson004】Imperative Sentences
  16. 什么是自底向上/自上而下的显著性目标检测?
  17. Symantec赛门铁克官网下载地址
  18. Brave Game
  19. 北邮计算机学院9月推免,夏令营、预推免总结--计算机方向 (南科大、自动化所、上科大、北邮)...
  20. DOM4J 不兼容的类型: JAVA.UTIL.LIST (ORG.DOM4J.NODE)无法转换为JAVA.UTIL.LIST(ORG.DOM4J.ELEMENT)

热门文章

  1. 生活热水循环泵选型怎么选,如何选型计算?
  2. matlab newsboy,Therebe句型的用法[定稿]
  3. 来,了解一下90年代的网站
  4. linux启用网卡的命令是,Linux网络配置命令
  5. 2015华为机试题整理
  6. docker-compose方式部署php项目
  7. Footprint:花式购买NFT就拥有了版权吗?
  8. 以太网中DS域及PHB映射
  9. Android高速下载器实现思路——单个任务的提速与优化
  10. asp access绍兴旅游毕业设计网站