一
应用安全基础
作为目前两大主流手机操作系统,Android和iOS已经牢牢的占据手机操作系统市场十余年。
Android是基于Linux内核的自由及开放源代码的移动端操作系统。该系统最初由Andy Rubin开发,在2005年被美国的谷歌公司收购。2007年11月,谷歌与多家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后谷歌以Apache开源许可证的授权方式,发布了Android的源代码。
iOS是苹果公司以Darwin(苹果公司开发的一款UNIX操作系统)为基础开发的一款移动端操作系统。不同于开源的Android系统,iOS系统选择了封闭,只能用于苹果旗下的iPad,iPhone,iPod touch等产品。
本章从App的签名、安装、权限、运行等几个角度,分别对iOS与Android的App进行详细介绍,并对比两者区别。
1.1 应用的签名
1.1.1 Android 签名机制和原理
Android 系统要求所有 APK(Android application package,Android应用程序包)必须使用证书进行数字签名,否则无法安装或更新。在Android安装或更新App时,系统首先检验App签名,如果App未签名或签名校验失败,安装操作将被拒绝。开发者可以自行为应用签名并将其上传到 Google Play 或其他应用商店,如果使用Android App Bundle格式在 Google Play 发布,则需将其上传至Google Play 管理中心,使用Google Play提供的功能进行应用签名。
签名利用摘要和非对称加密技术技术确保APK由开发者发布且未被篡改。摘要是使用哈希算法计算出的APK唯一的映射值,相当于APK的指纹,当APK文件内容发生任何改变时,摘要都会发生改变。签名使用开发者的私钥对摘要进行加密。用户端安装APK时,重新计算APK文件的摘要,然后使用开发者的公钥解密签名中的摘要,两者对比一致则可说明APK来源可信且未被篡改。
Android 11及以前版本存在以下四种应用签名方案:
jarsigner与apksigner的区别:
◆jarsigner:只能用于应用的v1签名,签名是只能使用keystore文件签名;
◆apksigner:可以用于v1、v2、v3和v4签名,签名时即可以使用keystore文件进行签名,还可以使用pem证书和私钥进行签名。
jarsigner -keystore keystore.jks -signedjar signed.apk unsigned.apk alias_name -storepass pwd
apksigner签名语法如下:
apksigner sign [signer_options] --ks keystore.jks | --key key.pk8 --cert cert.x509.pem --in unsigned_app.apk --out app-signed.apk
apksigner sign --v2-signing-enabled false --ks keystore.jks --in unsigned_app.apk --out app-signed.apk
apksigner sign --v3-signing-enabled true --ks keystore.jks --in unsigned_app.apk --out app-signed.apk
使用Android Studio创建签名文件Build > GenerateSignedBundle/APK > Apk > Next > Create new 根据提示设置文件生成路径和访问文件密码,设置文件名和签名密码 , 设置国家城市信息等信息即可。
使用命令行工具keytool生成签名文件
keytool -genkeypair -alias test -keyalg RSA -keypass 123456 -keystore TestKey.jks -storepass 123456 -validity 3650
keytool -list -v -keystore TestKey.jks -storepass 123456
1.1.2 iOS 签名机制和原理
苹果在iOS2.0版本中引入了强制代码签名(Mandatory Code Signing)技术。签名是iOS设备的安全和苹果的AppStore生态安全的基础,通过代码签名技术使苹果公司能够严格控制苹果设备设备上运行的代码,可以有效地防止来自外部的攻击。
苹果的签名证书按着使用用途可以分为三类:开发证书、企业证书和发布证书。开发证书是为方便开发人员在应用开发期间频繁地修改代码安装到设备上测试的签名解决方案。实现原理是分发给开发者一套密钥和证书,通过这套密钥和证书对App进行签名,苹果对开发者的身份进行“背书”,让设备信任开发者签名的应用。
开发者证书需要开发者手动生成,生成开发者证书主要有两个步骤:第一步,通过密钥串中的证书助理生成CSR文件(Certificate Signing Request),具体如下图所示:

第二步,在苹果开发者中心中的Certificates选项中选择创建一个证书,按要求将第一步中生成的CertificateSigningRequest.certSigningRequest文件上传便可生成开发者证书。如下图所示:
企业证书是本质就是苹果为企业级开发人员提供的签名证书。使用企业证书签名的应用可以直接安装到iOS设备不用提交苹果审核,只需在应用第一次启动时信任该证书即可正常使用。企业包常用于内部测试或提供给一些测试用户做为正式上线前的灰度测试,企业证书签名的应用无法上架AppStore。
发布证书就是苹果规定开发者将应用提交AppStore审核前,对应用进行签名的证书。证书通常命名为iPhone Distribution: xxxxxxxxx,用于AppStore校验提交上来的App的完整性,只有管理员以上身份的开发者账号才可以申请,可以控制提交权限的范围。Distribution证书只能用于正式应用的上架发布,不能用于应用的开发调试。
以开发者证书为例,介绍使用Xcode进行签名的流程。使用苹果的私钥对开发者的公钥进行签名并结合开发者的公私生成证书,将证书整合进Provisioning Profiles文件后同样使用苹果的私钥进行签名。应用开发完成以后使用开发者的私钥进行签名,将Provisioning Profiles文件导入应用中打包完成整个签名打包流程。具体签名流程如下图所示:
看雪ID:FIGHTING安
https://bbs.kanxue.com/user-home-452101.htm
# 往期推荐
3、安卓加固脱壳分享
球分享
球点赞
球在看
原文始发于微信公众号(看雪学苑):移动应用安全与风控——应用的签名
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论