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

白帽子讲Web安全-服务器端应用安全 1.注入攻击 注入攻击的本质,是把用户输入的数据当做代码执行。两个关键条件:一是用户能够控制输入,二是原本程序要执行的代码,拼接了用户输入的数据。 1.1SQL注入 SQL注入,是构造SQL执行语句拼接在输入参数中,从而执行SQL。若Web服务器开启了错误回显,则会披露敏感信息,为攻击者提供更大便利。 SQL盲注,是在服务器没有错误回显时完成的注入攻击。常见验证方法... 阅读详情

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


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


智能座舱架构与芯片- (10) 音频篇 下 若将有限个 量化样值的绝对值从小到大依次排列,并对应地依次赋予一个十进制数字代码(例如,赋予样值0的十进制数字代码为0),在码前以“+”、“-”号为前缀,来 区分样值的正、负,则量化后的抽样信号就转化为按抽样时序排列的一串十进制数字码流,即十进制数字信号。如果声学密封不牢,来自内部结构的噪声可能到达传感器,两个传感器之间的泄漏可能降低BF算法的性能。未来,随着汽车电动化的普及,传统的ANC降噪所针对的发动机噪音已经不复存在,而路噪问题将越发明显,因此,全新的RNC主动路噪消减技术将会有一个更为宽广的市场。 阅读详情

相关推荐

大模型辅助意图识别,更懂你的客户洞察平台

通过大量的学习和训练,大模型不仅具备庞大的知识库,更掌握着丰富的语言模式和语义规则,能够精准地理解每一段对话的含义,为每一通对话进行全面、准确的标注。主要来自客户的行为信息,将客户与机构的重要时刻以时间轴的方式呈现出来,掌握客户生命周期的完整脉络,识别一些容易被忽略的重要营销MOT(Moment Of Truth,关键时刻研究)机会,提示理财经理跟进处理。将客户的历史交易数据和埋点系统采集的客户行为数据结合起来,辅以部分内容资讯的偏好探测,综合分析和预测客户在各个维度的喜好程度,实现千人千面的客户推送。

Dezhuzhineng的博客 2161

【解决】秘钥硬编码安全问题

下面给一个方案,对数据进行变形。算法如下:对每一个字节做一次循环右移对每一个字节用一个表的数据做位异或操作转为16进制数目前没有安全的方法保存秘钥,除非使用硬件来解决(后台的加密机使用的就是硬件,秘钥放在芯片里),所以本地保存数据需要遵循:需要长久更安全的保存,使用keychain的方式保存不要保存敏感信息,如果要保存需要先做脱敏任何时候都不要保存密码。

键盘的起始页 4716

华为AR6140E/S5735设备密码策略配置全攻略:从复杂度到锁定机制

本文详细介绍了华为AR6140E/S5735设备的密码策略配置方法,涵盖密码复杂度、时效性和防护性三大核心维度。通过具体的CLI命令示例,指导管理员如何设置密码长度、字符组合、有效期及登录失败锁定等安全机制,为企业网络提供全面的用户名密码防护策略。

weixin_30836759的博客 531

解决方案-秘钥硬编码-入门渗透入门教程

背景APP中需要保存一些用户的个人信息到本地,比如:手机号、身份证、盐之类的,按要求不得明文存储。在早期方案中使用AES进行加解密,密钥拆分成几个部分

程序员六七的博客 1124

COMSOL介电弹性体数值仿真指南:预拉伸圆形DEA的稳态变形分析(I)

本期博客是《COMSOL介电弹性体数值仿真指南》系列博客中的一期。聚焦于介电弹性体驱动器(DEA)中最为经典的预拉伸圆形DEA驱动器构型,对其物理特性及数值仿真总体方案进行介绍与讨论。

忘了面孔的Batou 454

电动汽车远程监控与诊断软件:BMW ConnectedDrive EV远程监控二次开发_7.数据安全与隐私保护

数据加密是保护数据安全的重要手段之一。在电动汽车远程监控与诊断软件中,加密技术可以确保数据在传输过程中的安全性和完整性。常见的加密技术包括对称加密和非对称加密。

zhubeibei168的博客 884

【转】Android安全开发之浅谈密钥硬编码

密钥硬编码的主要形式有: 1、密钥直接明文存在sharedprefs文件中,这是最不安全的。 2、密钥直接硬编码在Java代码中,这很不安全,dex文件很容易被逆向成java代码。 3、将密钥分成不同的几段,有的存储在文件中、有的存储在代码中,最后将他们拼接起来,可以将整个操作写的很复杂,这因为还是在java层,逆向者只要花点时间,也很容易被逆向。 4、用ndk开发,将密钥放在so文件,加密解密操作都在so文件里,这从一定程度上提高了的安全性,挡住了一些逆向者,但是有经验的逆向者还是会使用IDA破解的。 5

g270382086的博客 1823

电子元器件选型与实战应用—01 电阻选型

大家好, 我是记得诚。这是《电子元器件选型与实战应用》专栏的第一篇文章,今天的主角是电阻,在每一个电子产品中,都少不了电阻的身影,其重要性不言而喻。

记得诚 3537

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

Android应用安全开发之浅谈密钥硬编码 作者:伊樵、呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码、文件中,这样做会引起很大风险。信息安全的基础在于密码学,而常用的密码学算法都是公开的,加密内容的保密依靠的是密钥的保密,密钥如果泄露,对于对称密码算法,根据用到的密钥算...

weixin_34216107的博客 220

世界模型(World Models)进展全景调研(截至 2025-08)

A5) 2019-07(待核验) | C-SWM:Contrastive Structured World Models(Kipf et al.)A6) 2019-07(待核验) | SLAC:Stochastic Latent Actor-Critic(Lee et al.)A3) 2015-12(背景注记,待核验) | Embed to Control(E2C,Watter et al.)Nature 2020)Repro/Code:werner-duvaud/muzero-general(社区)

u013250861的博客 489

内模控制(IMC)——理论、应用与实践

内模控制方法的核心思想是利用被控对象的数学模型(即内模)构建控制器,使得控制器可以“预知”被控系统的动态响应,从而在控制输入中提前补偿模型的固有特性和扰动影响。常见的内模控制结构中,将系统分为无延迟部分和扰动部分,并利用内部模型预测输出值,再通过反馈回路进行误差修正。utuimctufbtutui​mctuf​bt其中,uimctu_imc(t)ui​mct为内模预测得到的预补偿控制量,ufbtu_fb(t)uf​bt。

闲人编程的博客 2634

Android 硬编码密钥详解

摘要: 硬编码密钥是Android应用常见的安全隐患,攻击者通过反编译APK即可获取密钥,导致数据泄露、API滥用等问题。解决方案包括:1)避免密钥写入代码;2)使用Android Keystore系统存储密钥(推荐),通过硬件安全模块保护密钥;3)动态生成或从服务器获取密钥。示例展示了Keystore生成AES密钥、加密/解密的实现,确保密钥安全且不可直接访问。建议开发者遵循最小权限原则,结合NDK加固代码,并定期轮换密钥以提升安全性。

赵航的博客 725

LLM Wiki 的完整输入体系:LLM Wiki极简实战

LLM Wiki 的输入分为**四大类**,覆盖从"原始知识注入"到"系统行为控制"的全流程,所有输入都遵循"**原始资料不可变,规则可迭代,人类反馈闭环**"的核心原则。

ZhangJiqun&191cm&85kg 322

终极指南:如何检测和修复Android应用中的硬编码API密钥安全问题

Android应用安全是每个开发者和安全工程师都必须重视的关键问题。在Android应用开发过程中,**硬编码API密钥**是一个常见但需要关注的安全问题。本文将详细介绍如何识别、检测和修复这一安全关注点,保护你的应用免受数据泄露风险。💪 ## 🔍 什么是硬编码API密钥? **硬编码API密钥**指的是将认证信息直接写入应用源代码中的做法。这些信息可能包括: - 第三方服务API密钥

gitblog_00156的博客 470

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android开发中API密钥安全存储:从硬编码风险到企业级解决方案

在移动应用开发中,API密钥是应用与后端服务通信的核心凭证,其安全存储直接关系到数据安全与资源防护。从技术原理上看,密钥泄露往往源于开发初期为求便利而采用的硬编码方式,即将敏感信息明文写入源代码或资源文件。这种做法的技术风险在于,APK文件可被轻易反编译,导致密钥暴露,进而引发服务滥用、数据泄露和经济损失等连锁反应。其技术价值在于推动开发者建立安全优先的工程思维,采用分层防护策略。在应用场景上,针对不同安全等级的项目,可从基础的构建配置分离、结合代码混淆,进阶到使用Android Keystore Syst

weixin_27875131的博客 240

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android - 更安全地保存静态密钥,androidble开发教程

在日常开发中我们经常需要保存一些私密的信息,例如加解密的密钥等等。这时候我们就要来考虑如何存储密钥了。先来简单介绍几种存储方式: Java硬编码方式 SharedPreferences存储 文件存储 数据库存储 以上几种存储方式是很不安全的,例如采用硬编码方式存储,程序包很容易被反编译获取到密钥。SharedPreferences、文件和数据库又有可能因为用户的误删操作而丢失密钥,所以一般很少存储到这一类的文件中。那么问题来了,我们应该用什么方式来确保密钥的存储相对更安全呢? 密钥 存储

m0_66144910的博客 1355

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

即时通讯开发Android中密钥硬编码的风险

经常发现有开发者将密钥硬编码在Java代码、文件中,这样做会引起很大风险。 信息安全的基础在于密码学,而常用的密码学算法都是公开的,加密内容的保密依靠的是密钥的保密,密钥如果泄露,对于对称密码算法,根据用到的密钥算法和加密后的密文,很容易得到加密前的明文;对于非对称密码算法或者签名算法,根据密钥和要加密的明文,很容易获得计算出签名值,从而伪造签名。密钥硬编码在代码中,而根据密钥的用途不同,这导致了不同的安全风险,有的导致加密数据被破解,数据不再保密,有的导致和服务器通信的加签被破解,引发各种血案,本文主要借

weikeyun的博客 766

Android应用签名密钥安全配置:告别硬编码,实现自动化构建

在软件工程实践中,密钥管理是保障应用安全的核心环节。其基本原理是将敏感信息与源代码分离,避免因代码泄露导致密钥暴露。这一技术价值在于,它不仅保护了应用签名免遭恶意篡改,也为团队协作和CI/CD自动化流程提供了安全基础。通过将密钥存储在独立的属性文件中,并结合版本控制系统的忽略机制,开发者可以在Android应用的构建过程中,安全地管理签名配置。这种方案特别适用于需要区分开发、测试和生产环境的场景,是实现专业Android开发流程的关键一步。

weixin_30363509的博客 351

告别硬编码!Cipher.so让Android密钥安全存储不再头疼

# 告别硬编码!Cipher.so让Android密钥安全存储不再头疼 在Android开发中,你是否还在为如何安全存储API密钥、数据库密码等敏感信息而烦恼?硬编码在Java代码中?存储在`strings.xml`里?这些做法都如同将钥匙插在门锁上,恶意攻击者只需简单反编译就能轻松获取你的敏感数据。根据OWASP移动安全测试指南,**密钥硬编码**是移动应用最常见的安全漏洞之一,占比高达68%...

gitblog_00323的博客 407

2024年网络安全最新Android - 更安全地保存静态密钥

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

2401_84264010的博客 721
上一篇: Linux堆内存管理深入分析(上)
下一篇: [实践] Android5.1.1源码 - 让某个APP以解释执行模式运行
阿里安全
博客等级 码龄11年 260粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值