首页
社区
课程
招聘
[原创]移动应用安全与风控——应用的签名
发表于: 2023-5-29 11:22 24783

[原创]移动应用安全与风控——应用的签名

2023-5-29 11:22
24783

       作为目前两大主流手机操作系统,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进行详细介绍,并对比两者区别。

        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及以前版本存在以下四种应用签名方案:

v1:最基本的签名方案,基于Jar的签名

v2:提高验证速度并增强完整性保证(Android 7.0 引入)

v3:支持密钥轮替(Android 9.0 引入)

v4:根据APK的所有字节计算得出的Merkle哈希树,需v2或v3签名进行补充

备注:v4签名是Google为解决增量安装APK推出的功能,截至目前只能通过ADB安装的方式使用。

        Android签名方案是向下兼容的。Android 7.0引入v2签名,Android 9.0引入v3签名,Android 11开始支持v4签名,v4签名需要v2或v3签名进行补充,且签名信息需要单独的存储在 .apk.idsig 文件中。Android系统优先选择其所支持高版本签名进行校验,当不存在高版本签名时则向下选择。具体签名校验流程如下图:
图片描述
应用签名工具
        jarsigner是JDK提供的工具可以用于对jar签名,apksigner是Google官方提供的用于Android 应用签名和验证的工具。 无论是Android 应用的apk包还是jar包,本质都是zip格式的压缩包,因此签名流程相似。
jarsigner与apksigner的区别:

jarsigner签名语法如下:

keystore.jks是签名证书,signed.apk是签名后的apk,unsigned.apk是待签名的apk,alias_name是签名证书的alias属性,用来区分不同证书的,pwd是签名证书的密码。
apksigner签名语法如下:

使用 --ks 选项指定密钥库文件。使用 --key 和 --cert 选项分别指定私钥文件和证书文件。私钥文件必须使用 PKCS #8 格式,证书文件必须使用 X.509 格式。如果signer_options未指定,默认情况下apksigner会根据应用中的 --min-sdk-version 和 --max-sdk-version 的值来决定使用哪种此签名方案。
如果想禁用V2签名

如果想使用V3签名

创建应用签名所需的证书文件
方案一:
使用Android Studio创建签名文件Build > GenerateSignedBundle/APK > Apk > Next > Create new 根据提示设置文件生成路径和访问文件密码,设置文件名和签名密码 , 设置国家城市信息等信息即可。
图片描述

方案二:
使用命令行工具keytool生成签名文件

图片描述
参数说明
图片描述
证书文件内容查看:

图片描述

应用完成签名后应用中会新增 META-INF 文件夹,文件夹中包含如下三个文件:
图片描述
具体签名流程:
第一步,遍历应用中的文件并计算文件对应的 SHA-1 摘要,将所的文件摘要进行 BASE64 编码后写入签名文件即MANIFEST.MF 文件,具体MANIFEST.MF 文件示例内容下图所示:
图片描述

第二步,计算整个 MANIFEST.MF 文件的 SHA-1 摘要,进行 BASE64 编码后写入签名文件,即*.SF 文件;计算 MANIFEST.MF 文件中每一块摘要的 SHA-1 摘要,进行 BASE64 编码后写入 签名文件,即*.SF 文件。具体*.SF 文件示例内容下图所示:
图片描述
第三步,计算整个 *.SF 文件的数字签名,将数字签名和 开发者X.509 数字证书写入 .RSA 文件。具体.RSA文件示例内容下图所示:
图片描述
        读到这里应该已经对Android应用签名有了比较清晰的了解,最后在介绍一下Android应用签名都有哪些用处,具体如下图所示:
图片描述

        苹果在iOS2.0版本中引入了强制代码签名(Mandatory Code Signing)技术。签名是iOS设备的安全和苹果的AppStore生态安全的基础,通过代码签名技术使苹果公司能够严格控制苹果设备设备上运行的代码,可以有效地防止来自外部的攻击。
        苹果的签名证书按着使用用途可以分为三类:开发证书、企业证书和发布证书。开发证书是为方便开发人员在应用开发期间频繁地修改代码安装到设备上测试的签名解决方案。实现原理是分发给开发者一套密钥和证书,通过这套密钥和证书对App进行签名,苹果对开发者的身份进行“背书”,让设备信任开发者签名的应用。
        开发者证书需要开发者手动生成,生成开发者证书主要有两个步骤:第一步,通过密钥串中的证书助理生成CSR文件(Certificate Signing Request),具体如下图所示:
图片描述
图片描述
        完成操作之后会生成一个名为CertificateSigningRequest.certSigningRequest的文件,在生成该文件的同时密钥串中会自动生成了一对公、私钥。如下图所属:
图片描述
        第二步,在苹果开发者中心中的Certificates选项中选择创建一个证书,按要求将第一步中生成的CertificateSigningRequest.certSigningRequest文件上传便可生成开发者证书。如下图所示:
图片描述
        企业证书是本质就是苹果为企业级开发人员提供的签名证书。使用企业证书签名的应用可以直接安装到iOS设备不用提交苹果审核,只需在应用第一次启动时信任该证书即可正常使用。企业包常用于内部测试或提供给一些测试用户做为正式上线前的灰度测试,企业证书签名的应用无法上架AppStore。
        发布证书就是苹果规定开发者将应用提交AppStore审核前,对应用进行签名的证书。证书通常命名为iPhone Distribution: xxxxxxxxx,用于AppStore校验提交上来的App的完整性,只有管理员以上身份的开发者账号才可以申请,可以控制提交权限的范围。Distribution证书只能用于正式应用的上架发布,不能用于应用的开发调试。
        以开发者证书为例,介绍使用Xcode进行签名的流程。使用苹果的私钥对开发者的公钥进行签名并结合开发者的公私生成证书,将证书整合进Provisioning Profiles文件后同样使用苹果的私钥进行签名。应用开发完成以后使用开发者的私钥进行签名,将Provisioning Profiles文件导入应用中打包完成整个签名打包流程。具体签名流程如下图所示:
图片描述
        生成的应用签名文件CodeResources存放在IPA安装包的_CodeSignature目录中。签名文件中存储安装包中所有文件起的签名信息,具体内容如下图所示:
图片描述
        iOS系统会在应用安装时进行签名校验,通过校验后才能正常安装到设备。签名校验流程如下图所示:
图片描述
        苹果不仅可以通过签名保证iOS应用的完整性防止被篡改,还可以根据开发者公钥生成证书验证是否为合法的开发者。应用程序只有签名后才能够正常使用苹果的服务,苹果就是通过这些手段实现其对整个生态的控制。

jarsigner -keystore keystore.jks -signedjar signed.apk unsigned.apk alias_name -storepass pwd
jarsigner -keystore keystore.jks -signedjar signed.apk unsigned.apk alias_name -storepass pwd
apksigner sign [signer_options] --ks keystore.jks | --key key.pk8 --cert cert.x509.pem --in unsigned_app.apk --out app-signed.apk

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2023-7-7 07:45 被FIGHTING安编辑 ,原因:
收藏
免费 7
支持
分享
最新回复 (1)
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
nice , good 吆西
2023-5-29 11:30
1
游客
登录 | 注册 方可回帖
返回
//