iOS应用签名
一、签名原理
签名就设计到了加密,加密有对称、非对称、hash
等,iOS
这里主要使用了hash+非对称
,两者结合使用来对应用进行加密的。
HASH加密
将任意大小的数据通过散列算法变换成固定长度的字符,通常为32
位的固定字符,又称hash
值。
特点:算法公开、不可逆、结果定长,常见的MD5
加密。
非对称加密
公钥加密,私钥解密,加密过程复杂,需要进行大量计算,因此效率很低。明文->公钥->密文 密文->私钥->明文
。支付宝,微信等支付过程需要的签名也是非对称加密过程。数字签名流程如下:
iOS签名
为避免垃圾应用的安装,破坏应用生态,苹果采用更高级的加密,对应用进行双层代码签名。
1、首先在Mac
端生成一对公私钥(Xcode
自动生成)为公钥M
和私钥M
;
2、苹果有一对固定的公私钥,私钥在苹果后台,公钥在每个iOS
系统中,称公钥A
,私钥A
;
3、把公钥M
和开发者信息,上传到苹果后台(CSR文件
),用苹果后台里的私钥A
去签名公钥M
,得到一个含有公钥M
和签名
的数据包,该包即为证书
;
4、iPhone中的公钥A
可解密用苹果服务器私钥A
加密的公钥M
,通过公钥M
可以对加密的APP进行解密。
描述文件:包含证书、APPID、设备id、打包后用来证明我们的程序的安全性和合法性。如常用的测试包,需要添加测试人员的udid
,苹果需要对其验证后,相应的设备才能安装。签名原理如图:
二、手动签名
手动签名是通过自定义权限文件,通过权限文件和签名工具对破壳应用进行重签名,让三方应用在我们的xcode
上运行。
获取破壳ipa
:
- 通过越狱手机获取破壳应用,参考《iOS砸壳》;
- 通过
爱思助手
获取越狱应用。
将砸壳应用放到桌面或其他方便操作的地方,当前使用的是微信应用:
签名步骤
1、创建一个WeChat
工程,本测试中使用的是xcode
自动生成的证书和描述文件,也可以使用手动创建的证书和描述文件,都是从苹果服务器申请获取的,所以能对APP
进行手动签名。接入真机并编译,获取.app
中的描述文件。如下图:
2、右键.app
显示包内容复制embedded.mobileprovision
到桌面备用,使用命令查看描述文件中的权限配置(Entitlements
下的为权限配置):
1 | security cms -D -i embedded.mobileprovision |
权限文件部分:
1 | <key>Entitlements</key> |
3、创建一个plist
权限文件,并将embedded.mobileprovision
中的权限文件复制到plist
中,用来对砸壳应用重签名。
4、将权限文件移动到桌面或其他方便操作的地方,并将embedded.mobileprovision
文件加入到砸壳应用包中(.app
右键显示包内容)。如下图:
5、修改砸壳应用中包中info.plist
的唯一标识:
6、给可执行文件执行权限
1 | chmod +x WeChat |
7、进入到桌面砸壳应用,因为对Watch
中的app
无法签名,所以直接删除,Plugins
中插件无法被验证不能使用,所以需要删除。Watch
文件(删除):
PlugIns
文件(删除):
8、进入Frameworks
(.app
中的文件)文件中对所有库重签名。
1)查看当前安装的证书
1 | security find-identity -v -p codesigning |
2)使用可用证书对每一个库签名
1 | codesign -fs "iPhone Developer: yahibo@qq.com (64R6BCB698)" ProtobufLite.framework |
注意:签名证书要与工程中使用的证书保持一致
签名使用的证书:
对Frameworks
下的所有库重签名:
9、签名APP
,返回桌面,用已经创建好的权限文件对.app
重新签名
1 | codesign -fs "iPhone Developer: yahibo@qq.com (64R6BCB698)" --no-strict --entitlements=Entitlements.plist Payload/WeChat.app |
在创建工程时自动生成的描述文件中已经包含了测试设备id
,签名后app
即可安装到测试设备上;如果想添加多台设备,可以自己创建证书,创建描述文件时添加需要安装的设备,重签名使用该证书即可。
安装:
1、签名完之后可以放在xcode
中替换原有的.app
,直接运行;如下图:
2、打包APP,通过Xcode->window devices
安装ipa
包。打包命令如下:
1 | zip -ry WeChat.ipa Payload |
安装ipa
:
总结
应用签名步骤如下:
- 从
爱思助手
或越狱手机
中获取解密ipa包
; - 创建新应用,并安装至手机,获取
.app包
中的描述文件; - 从描述文件中获取权限配置,并创建
en.plist
权限文件; - 进入解密
ipa包
中的.app文件
,移除Plugin
插件及Watch
文件; - 使用上面创建工程的证书,对解密的
.app/Frameworks
文件下的库进行重签名; - 将第
2步
获取的描述文件放入解密的.app包
下; - 使用第
3步
的en.plist
权限文件对整个.app包
进行重签名; - 向手机安装
.app包
或者打包为.ipa包
。
注意
在操作过程中发现以下问题:
1、通过越狱手机获取到的破壳应用,由于手机CPU
架构不同(测试用iPhone5
),会导致安装失败;
2、创建的工程获取描述文件时注意,要使用一手描述文件(重新编译描述文件会发生变化,签名APP
验证不通过)。
三、脚本签名
熟悉了签名原理和签名流程,那么就可以把手动签名过程一步步改写为脚本,通过脚本来对三方应用进行签名。xcode
调试中会对.ipa
做权限管理,因此脚本中可以省略权限签名。
获取破壳ipa
:
- 通过越狱手机获取破壳应用,参考《iOS砸壳》;
- 通过
爱思助手
获取越狱应用。
新建xcode
工程,在工程文件中新建两个文件夹tool
、app
。
tool
文件存放签名脚本;app
文件存放要启动的.ipa
破壳应用。
签名脚本:
脚本:
1 | 定义目录路径 ${SRCROOT}为当前工程的根目录 |
- 在
Run Script
中添加脚本路径 - 注意:在工程中需要给SignApp.sh脚本可执行权限:
chmod +x SignApp.sh
需要安装的应用:
以上步骤结束后,运行工程即可,编译完后会执行脚本,脚本来帮助我们重签名。
运行安装如下:
Xcode调试:
通过这种方法就更方便了,新建工程,放入签名脚本和三方破壳ipa,直接运行即可,通过xcode
可进行应用调试,查看页面布局。