0 First Principle 第一性原理
0-1 SSH是干什么的
用服务器公钥加密自己的登录信息(有对方的公钥,通过自己的用户名密码,可以安全的让对方验证你的身份)
0-2 HTTPS为了解决什么问题
验证对方身份、加密通信内容
0-3 Github,在账号中设置我们自己的公钥干什么
通过git协议,用你的公钥替代登录信息(对方有你的公钥,也可以安全的验证你的身份)
0-4 苹果通过iOS证书,希望做到什么
二次验证:
手机需要知道App的来源、决定是否安装。
服务器知道是谁在提交App、内容有没有被修改。
方式:
手机内置Apple公钥,可以解开证书中的App公钥。App公钥可以解开MachO。这样说明证书、MachoO都没有被篡改过。
提交还不是关键,因为毕竟提交是在登录状态下进行的。
1 SSH的用途
SSH主要用于安全的远程登录
目的:输入的用户名/密码只希望服务器看到。
解决:使用服务器的publicKey
加密
。问题&解决:防止伪装(即中间人攻击),要对照服务器的公钥(太长,所以都是对照公钥的MD5,对照过程是去官网查看)
1-1 SSH的概念
SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。
OpenSSH是一个开源实现。
1-2 SSH细节
2 HTTPS
目的:防止窃听、修改、伪装。(HTTP协议下,Charles、路由器都可以做到)
解决:彼此确认身份 + 内容加密。
确认身份的方法:签名 + 验证。
签名
:用自己的私钥对摘要(如MD5/SHA)加密。
验证
:用对方的公钥解密,能解开说明是对方发的,内容不会是被篡改了的。
内容加密
:用对方的公钥加密,对方用自己的私钥解密。
3 Github中的使用
github提供两种方式的命令行登录
- git@github.com:AFNetworking/AFNetworking.git //必须配置SSH公钥
- https://github.com/AFNetworking/AFNetworking.git
第二种在commit代码的时候,都必须配置 邮箱/密码(git的使用,第11条)
第一种方式,自己必须是仓库管理员才可以,设置后,commit/push等就不需要密码了。(需要设置git config --global user.name,不用设置email/password)
这里ssh的原理,是服务器有了你的公钥,就可以验证你的身份了。所以不需要走用户名/密码的验证流程。
4 苹果中的使用
图片是Hank的图。
4.1 目的:互相确认身份。
苹果知道是谁提交的App,有没有被修改
。(通过开发者本地的密钥对M)//因为有如FastLane等工具可以做提交。苹果手机知道App的来源
。(通过苹果服务器的密钥对A)
AppStore下载的可以直接安装。
未付款开发者/企业开发者需要用户信任。
付费开发者需要验证是否为测试机
4.2 创建描述文件流程:Mac电脑 <-> 苹果服务器
登录状态下(第一重验证),提交csr
文件(包括开发者相关信息、公钥M
)。
苹果返回描述文件Provisioning profile
(.mobileprovision
文件),包含了
1. 苹果私钥加密过的`cer`证书文件(包括了`公钥M`)。(经过私钥A处理的Hash,应该只是用于校验的)
2. AppID/测试设备ID/权限文件(`Entitlements`)
4.3 Mac电脑 打包App 流程
- 对于Distribute版本的App,会用客户端私钥(
p12
文件),对MachO
文件(可执行二进制文件)签名,防止修改。
a.签名的过程
:首先对APP进行一次SHA256加密,获得APP的HASH值,在用私钥M 对HASH值进行加密就生成了一个APP签名
b. 因为签名必须有私钥(p12文件),所以如果希望在其他电脑上进行签名,就必须把p12文件传到那台电脑 - 对于Distribute/Develop版本的App,都会有
MachO
/描述文件
。
4.4 iPhone设备 验证App 流程
- 对于Develop版本的App,会验证测试设备ID
- 对于Distribute版本的App,iPhone会用
公钥A
解密描述文件中的公钥M(同时验证了证书是由私钥A
签名的),然后用公钥M
校验MachO(验证证书是由私钥M
签名的)。 - 此外,当使用企业证书/未付费个人证书安装App时,会要求用户信任一个证书,这个证书的作用等同于密钥对A(但就不是AppStore认证的了,但也是苹果服务器的密钥对)。
4.5 小结
- 提交中的文件:
p12文件,用于MachO签名。 -> 该签名用于appstore验证开发者身份,并验证MachO没有被修改。
provisioning profile,用于手机检测要不要安装App,主要是通过cer中的公钥/其他配置文件。
- 申请中的文件:
csr文件,用于制作cer证书。
- 注意:这里没有涉及开发者对服务器的验证:我怎么知道我提交的是真正的AppStore,因为这个需要自己去保证。
4.6 企业证书
在苹果手机中安装了一个企业证书的公钥,并且在手机中信任。
整个流程中就是,把用Apple公钥解密App的证书,改成了用企业证书解密特定的app。
4.7 越狱后安装盗版app
猜想:越狱应该是,让整个打包和验证过程绕开了Apple公钥,这样整个验证流程就全在自己的掌控中了。
4.8 思考:为什么苹果不把app签名文件用苹果私钥加密(放在描述文件中),这样就不用二次验证了啊?
因为这样不符合单一功能原则。
比如,按现有方案,app更新提交,描述文件无需修改。而如果按照标题中的方案,就需要修改描述文件。
5 Socket与TCP、UDP
5.1 TCP、UDP底层实现都是通过Socket实现的。
主要涉及接口监听(接收数据)、建立socket套接字、发送数据。
5.2 TCP协议中的三次握手和四次握手
- TCP协议是有连接的双工的通信,即
两条连接
。 - 建立连接三次握手
发起连接A请求 -> 确认连接A请求/发起连接B请求 -> 确认连接请求B - 中断连接四次握手
发起中断A请求 -> 确认中断A请求、继续发送B的数据 -> B数据发送完成后,发起中断B请求 -> 确认中断B请求。