概述:
加密解密
单向散列函数
数字签名
iOS签名机制 和 证书
重签名
一、加密解密
1.1、常见的英文单词
encrypt
:加密、decrypt
:解密、plaintext
:明文、ciphertext
:密文-
1.2、加密 和 解密 简介
-
1.3、根据密钥的使用方法,可以将密码分为2种
- 对称密码:加密和解密密码相同
- 公钥密码(非对称密码):加密和解密密码不同
-
1.4、对称密码(Symmetric Cryptography)
在对称密码中,加密、解密时使用的是同一个密钥,常见的对称密码算法有:DES
、3DES
、AES
-
1>、DES(Data Encryption Standard)
- DES是一种将64bit明文加密成64bit密文的对称密码算法,密钥长度是56bit
- 规格上来说,密钥长度是64bit,但每隔7bit会设置一个用于错误检查的bit,因此密钥长度实质上是56bit
- 由于DES每次只能加密64bit的数据,遇到比较大的数据,需要对DES加密进行迭代(反复)
- 目前已经可以在短时间内被破解,所以不建议使用
-
2>、3DES
- 3DES,将DES重复3次所得到的一种密码算法,也叫做3重DES
- 目前还被一些银行等机构使用,但处理速度不高,安全性逐渐暴露出问题
- 3个密钥都是不同的,也称为DES-EDE3
-
如果所有密钥都使用同一个,则结果与普通的DES是等价的;如果密钥1、密钥3相同,密钥2不同,称为DES-EDE2
-
3>、AES(Advanced Encryption Standard)
- 取代DES成为新标准的一种对称密码算法
- AES的密钥长度有128、192、256bit三种
- 在2000年时选择Rijindael算法作为AES的实现
- 目前AES,已经逐步取代DES、3DES,成为首选的对称密码算法
- 一般来说,我们也不应该去使用任何自制的密码算法,而是应该使用AES,它经过了全世界密码学家所进行的高品质验证工作
-
-
1.5、密钥配送问题
在使用对称密码时,一定会遇到密钥配送问题
-
假设,Alice 将使用对称密码加密过的消息发给了 Bob
- 只有将密钥发送给 Bob,Bob 才能完成解密
- 在发送密钥过程中,可能会被 Eve 窃取密钥,最后 Eve 也能完成解密
-
如何解决密钥配送问题?有以下几种解决密钥配送的方法
- 事先共享密钥(比如U盘拷贝)
- 密钥分配中心
- Diffie-Hellman密钥交换
- 公钥密码
-
1.6、公钥密码(Public-key Cryptography)
公钥密码中,密钥分为
加密密钥
、解密密钥
2种,它们并不是同一个密钥公钥密码也被称为
非对称密码
(Asymmetric Cryptography)-
在公钥密码中
- 加密密钥,一般是公开的,因此该密钥称为公钥(public key)
- 解密密钥,由消息接收者自己保管的,不能公开,因此也称为私钥(private key)
- 公钥和私钥是一 一对应的,是不能单独生成的,一对公钥和密钥统称为密钥对(key pair)
- 由公钥加密的密文,必须使用与该公钥对应的私钥才能解密
- 由私钥加密的密文,必须使用与该私钥对应的公钥才能解密
-
解决密钥配送问题
- 由消息的接收者,生成一对公钥、私钥
- 将公钥发给消息的发送者
- 消息的发送者使用公钥加密消息
RSA:目前使用最广泛的公钥密码算法是RSA,RSA的名字,由它的3位开发者,即Ron Rivest、Adi Shamir、Leonard Adleman的姓氏首字母组成
-
1.6、混合密码系统(Hybrid Cryptosystem)
-
1>、混合密码系统
- 对称密码的缺点:不能很好地解决密钥配送问题
- 公钥密码的缺点:加密解密速度比较慢
- 混合密码系统,是将对称密码和公钥密码的优势相结合的方法,解决了公钥密码速度慢的问题,并通过公钥密码解决了对称密码的密钥配送问题,比如:网络上的密码通信所用的SSL/TLS都运用了混合密码系统
-
2>、混合密码-加密
- 会话密钥(session key)
- 为本次通信随机生成的临时密钥
- 作为对称密码的密钥,用于加密消息,提高速度
- 加密步骤(发送消息)
- 首先,消息发送者要拥有消息接收者的公钥
- 生成会话密钥,作为对称密码的密钥,加密消息
- 用消息接收者的公钥,加密会话密钥
- 将前2步生成的加密结果,一并发给消息接收者
- 发送出去的内容包括
- 用会话密钥加密的消息(加密方法:对称密码)
- 用公钥加密的会话密钥(加密方法:公钥密码)
- 会话密钥(session key)
3>、混合密码-解密
解密步骤(收到消息)
消息接收者用自己的私钥解密出会话密钥
再用第1步解密出来的会话密钥,解密消息
- 3>、混合密码-加密解密流程 总结,Alice >>>>> Bob
-
发送过程,加密过程
- 1.Bob先生成一对公钥、私钥
- 2.Bob把公钥共享给Alice
- 3.Alice随机生成一个会话密钥(临时密钥)
- 4.Alice用会话密钥加密需要发送的消息(使用的是对称密码加密)
- 5.Alice用Bob的公钥加密会话密钥(使用的是公钥密码加密,也就是非对称密码加密)
- 6.Alice把第4、5步的加密结果,一并发送给Bob
-
接收过程,解密过程
- 1.Bob利用自己的私钥解密会话密钥(使用的是公钥密码解密,也就是非对称密码解密)
- 2.Bob利用会话密钥解密发送过来的消息(使用的是对称密码解密)
-
-
二、单向散列函数(One-way hash function)
-
2.1、单向散列函数的简单介绍
单向散列函数,可以根据根据消息内容计算出散列值。散列值的长度和消息的长度无关,无论消息是1bit、10M、100G,单向散列函数都会计算出固定长度的散列值。 -
2.2、单向散列函数的特点
根据任意长度的消息,计算出固定长度的散列值
计算速度快,能快速计算出散列值
-
消息不同,散列值也不同
-
具备单向性
-
2.3、单向散列函数的分类
单向散列函数,又被称为消息摘要函数(message digest function),哈希函数
输出的散列值,也被称为消息摘要(message digest)、指纹(fingerprint)- 常见的几种单向散列函数
- MD4、MD5
产生128bit的散列值,MD就是Message Digest的缩写,目前已经不安全
Mac终端上默认可以使用md5命令 - SHA-1
产生160bit的散列值,目前已经不安全 - SHA-2
SHA-256、SHA-384、SHA-512,散列值长度分别是256bit、384bit、512bit - SHA-3 全新标准
- MD4、MD5
- 常见的几种单向散列函数
-
2.4、如何防止数据被篡改
对文件进行 单向散列值获取,然后进行对比单向散列值是否一样 -
2.5、单向散列函数的应用 – 防止数据被篡改
-
防止文件被修改
-
查看下载的文件是否是正版,如 https://www.realvnc.com/en/connect/download/vnc/
-
口令加密:服务器只存储用户密码的
单向散列函数的值
,保证安全
-
-
2.6、想象以下场景,我们如何验证信息来源的正确性
Alice发的内容有可能是被篡改的,或者有人伪装成Alice发消息,或者就是Alice发的,但她可以否认
问题来了:Bob如何确定这段消息的真实性?如何识别篡改、伪装、否认?
解决方案:数字签名
三、数字签名
-
3.1、数字签名
-
在数字签名技术中,有以下2种行为
-
生成签名
:由消息的发送者
完成,通过签名密钥
生成 -
验证签名
:由消息的接收者
完成,通过验证密钥
验证
-
如何能保证这个签名是消息发送者自己签的?
答案:用消息发送者的私钥进行签名,接收者用工要进行验证签名
-
-
3.2、数字签名和公钥密码
数字签名,其实就是将公钥密码
反过来使用 -
3.3、数字签名的过程
这样会有一个问题:对内容签名会增加其传输内容的大小,后面会做出改进的方案 -
3.4、数字签名的过程 – 改进
对发送的内容的单向散列函数值进行一个 数字签名,接收者只需要对内容做一个散列值的对比即可 -
3.4、数字签名 – 疑惑
- 如果有人篡改了文件内容或者签名内容,会是什么结果?
答:签名验证失败,证明内容会篡改 - 数字签名不能保证机密性?
答:数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改 - 数字签名的作用
答:确认消息的完整性、识别消息是否被篡改、防止消息发送人否认
- 如果有人篡改了文件内容或者签名内容,会是什么结果?
-
3.5、数字签名无法解决的问题
- 要正确使用签名,前提是
用于验证签名的公钥必须属于真正的发送者 - 如果遭遇了中间人攻击,那么
公钥将是伪造的、数字签名将失效 - 所以在验证签名之前,首先得先验证公钥的合法性
- 如何验证公钥的合法性?
答:证书
- 要正确使用签名,前提是
-
3.6、证书(Certificate)
- 证书,联想的是驾驶证、毕业证、英语四六级证等等,都是由权威机构认证的
- 密码学中的证书,全称叫公钥证书(Public-key Certificate,PKC),跟驾驶证类似
- 里面有姓名、邮箱等个人信息,以及此人的公钥
- 并由认证机构(Certificate Authority,CA)施加数字签名
- CA就是能够认定“公钥确实属于此人”并能够生成数字签名的个人或者组织
- 有国际性组织、政府设立的组织
- 有通过提供认证服务来盈利的企业
- 个人也可以成立认证机构
-
3.7、证书的利用:保证了公钥的正确性,防止中间人攻击,这样数字签名才有意义
-
3.8、证书的注册和下载
四、iOS签名机制 和 证书
-
4.1、iOS签名机制 的简单介绍
- iOS签名机制的作用
答:保证安装到用户手机上的APP都是经过Apple官方允许的 - 不管是真机调试,还是发布APP,开发者都需要经过一系列复杂的步骤
- 生成CertificateSigningRequest.certSigningRequest文件(自己Mac 电脑的公钥,一般我们从钥匙串获取的)
- 获得ios_development.cer\ios_distribution.cer证书文件(自己电脑的公钥被苹果server端的私钥加密后的证书)
- 注册device、添加App ID(配置的一些信息)
- 获得*.mobileprovision文件(配置文件)
- iOS签名机制的作用
-
4.2、
certSigningRequest
、.cer
、.mobileprovision文件
究竟里面包含了什么?有何用处? -
4.3、iOS签名机制 – 生成Mac设备的公私钥
CertificateSigningRequest.certSigningRequest文件:就是Mac设备的公钥 -
4.4、iOS签名机制 – 获得证书
-
ios_development.cer
、ios_distribution.cer
文件:利用Apple后台的私钥,对Mac设备的公钥进行签名后的证书文件
-
-
4.5、iOS签名机制 – 生成mobileprovision(配置文件)
-
4.6、iOS签名机制 - AppStore
- 如果APP是从AppStore下载安装的,你会发现里面是没有mobileprovision文件的
- 它的验证流程会简单很多,大概如下所示
五、重签名
-
5.1、重签名的简单介绍
- 如果希望将破坏了签名的安装包,安装到非越狱的手机上,需要对安装包进行重签名的操作
- 注意:
- 安装包中的可执行文件必须是经过脱壳的,重签名才会有效;
- .app 包内部的所有动态库( .framework、.dulib)、AppExtension(PlugIns文件夹,拓展名是 appex)、WatchApp(Watch文件夹)都需要重新签名
- 重签名打包后,安装到设备的过程中,可能需要经常查看设备的日志信息
- 程序运行过程中:
Window
->Devices and Simulators
->View Device Logs
- 程序安装过程中:
Window
->Devices and Simulators
->Open Console
- 程序运行过程中:
-
5.2、重签名步骤
-
准备一个
embedded.mobileprovision
文件(配置文件
)(必须是付费证书产生的,appid、device一定要匹配),并放入 .app 包中- 可以通过 Xcode 编译来自动生成,然后在编译后的 APP 包中找到
- 可以去开发者证书网站生成下载
-
从 embedded.mobileprovision 文件中提取 entitlements.plist 权限文件
// 第一步 security cms -D -I embedded.mobileprovision > temp.plist // 第二步 /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
-
查看可用证书
security find-identity -v -p codesigning
-
对.app内部的动态库、AppExtension 等进行签名
codesign -fs 证书ID xxx.dylib
-
对 .app 包进行签名
codesign -fs 证书ID --entitlements entitlements.plist xxx.app
-
-
-
5.3、重签名 GUI 工具
- 第一种:iOS App Signer(推荐)
可以对.app
重签名打包成ipa
,需要在.app
包 中提取对应的embedded.mobileprovision
文件 - 第二种:iReSign
可以对 ipa 进行重签名,需要提供entitlements.plist
、embedded.mobileprovision
文件的路径
- 第一种:iOS App Signer(推荐)
-
5.4、通过 Theos 开发的动态库插件(dylib)
我们在 Theos 开发的 动态库卡插件
- 重签名的app要是破壳的
- 重签名的app要是破壳的
-
5.5、动态库注入(或者是动态库的插入)
可以使用 insert_dylib 库将动态库注入到 Mach-O 文件中
-
下载好,打开,编译后把文件放在
/usr/local/bin
目录下 -
用法
-
insert_dylb 动态库加载路径/动态库 Mach-O文件
,例如insert_dylib @executable_path/动态库插件 Mach-O文件
-
有 2 个经常用参数选项
--weak
即使动态库找不不到也不会报错
--all-yes
后面所有的选择都为 yesinsert_dylib @executable_path/动态库插件 Mach-O文件 --all-yes --weak
insert_dylib
的本质是往 Mach-O 文件的 Load Commands 中添加了一个LC_LOAD_DYLIB
或LC_LOAD_WEAK_DYLIB
-
在最后加上可执行文件的名称,把之前的可执行文件给替换掉,生成新的可执行文件
insert_dylib @executable_path/动态库插件 Mach-O文件 --all-yes --weak Mach-O文件
-
可以通过 otool 查看 Mach-O 的动态库依赖信息:
otool -L Mach-O文件
或者otool -L 动态库文件
-
-
5.6、更改动态库加载地址
-
可以使用 install_name_tool 修改 Mach-O文件中动态库的加载地址
-
install_name_tool -change 旧地址 新地址 Mach-O文件或者动态库文件
,如下install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/CydiaSubstrate 动态库文件名字
-
-
通过 Theos开发的动态库插件(dylib)
- 默认都依赖于
Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
- 如果将要动态库插件打包到 ipa 中,也需要将
CydiaSubstrate
打包到 ipa 中,并且修改下 CydiaSubstrate 的加载地址 @Loader_path
- 默认都依赖于
-
2 个常用环境变量
-
@executable_path
代表可执行文件所在的目录 -
@loader_path
代表动态库所在的目录
-
-
-
5.7、动态库插件安装未越狱手机上总结,以为
爱奇艺
安装插件为例,步骤如下-
第 1 步:使用越狱手机下载
爱奇艺
, 获取砸壳爱奇艺 app,我们这里使用 Clutch 工具
-
第 2 步:使用 Theos 开发的动态库插件(dylib) , 并开发插件
-
使用 Reveal 找到要 hook 的控制器,比如 爱奇艺的首页
QYRecomChannelViewControllerV3
-
编写 Hook代码,在爱奇艺的首页 弹个提示框即可
-
-
把动态库运行在 越狱手机上,并获取动态库
cd 进入 Tweak.x 所在的文件夹下 make clean make make package make install
上面的步骤执行完,获取动态库
-
第 3 步:拿到动态库依赖的 CydiaSubstrate
- 默认都依赖于
Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
- 默认都依赖于
-
第 4 步:获取一个包含 未越狱手机的 embedded.mobileprovision 文件(配置文件)
- 可以通过 Xcode 编译来自动生成,然后在编译后的 APP 包中找到
- 可以去开发者证书网站生成下载
-
第 5 步:把 动态库插件、embedded.mobileprovision 文件、CydiaSubstrate 文件 放到 爱奇艺破壳后的包里
-
第 6 步:动态库插件的插入,使用工具
insert_dylib
insert_dylib @executable_path/动态库插件 Mach-O文件 --all-yes --weak Mach-O文件
- 提示:我们这里指的
Mach-O文件
指的是爱奇艺的可执行文件iQiYiPhoneVideo
- 如:
insert_dylib @executable_path/tweak_iqy.dylib iQiYiPhoneVideo --all-yes --weak iQiYiPhoneVideo
- 提示:我们这里指的
-
第 7 步:修改 动态库插件中 CydiaSubstrate 的路径
- install_name_tool -change 旧地址 新地址 Mach-O文件或者动态库文件
- 如:
install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/CydiaSubstrate tweak_iqy.dylib
-
第 8 步:证书对 动态库插件和CydiaSubstrate 签名
-
查看可用的证书:security find-identity -v -p codesigning
-
对我们开发的插件动态库进行签名
codesign -fs 证书ID xxx.dylib
-
对 CydiaSubstrate 进行签名
codesign -fs 证书ID CydiaSubstrate
检查我们的 APP 包还有没有其他的动态库,如:.app 包内部的所有动态库( .framework、.dulib)、AppExtension(PlugIns文件夹,拓展名是 appex)、WatchApp(Watch文件夹)都需要重新签名,和我们自己开发的动态库一样需要重新签名
-
-
第 9 步: 对 .app 包进行签名,推荐我们使用 iOS App Signer 对
.app
包进行重签名codesign -fs 证书ID --entitlements entitlements.plist xxx.app
-
第 10 步: 安装重签名后的 app 包
-