提示:由于水平有限,如发现有疑问或错误的地方请毫不客气的提出、讨论,我会在第一时间回复,感谢在先
- 对称加密与非对称加密;约定把通话内容放在一个小集装箱里面,我与其他通话的人首先都知道这个打开这个集装箱的药匙,这样就就可以安全的进行通话;但是有一个问题需要解决:如何生成一把药匙或者如何安全的把药匙传给需要通信的那个人?非对称加密此时刚刚能够解决这个问题.使用非对称加密的时候我们首先会交换对方的公匙,然后传输数据的时候使用对方的公匙加密数据,接受信息的人,使用自己的私匙进行解密,通信过程中有两对公私匙;所以我们就可以先用分对称加密安全的传输我们对称加密时用那把匙,然后再使用对称加密通信.
- 既然有了非对称加密,通信过程中一直使用非对称加密不就行了,为什么还要使用对称加密?非对称加密比对称加密计算量大,耗时多.
-
密码登录以及公匙登录
-
密码进行登录,主要流程为:
- 客户端连接上服务器之后,服务器把自己的公钥传给客户端.
- 客户端输入服务器密码通过公钥加密之后传给服务器.
- 服务器根据自己的私钥解密登录密码,如果正确那么就让客户端登录.
-
公钥登录,公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:
- 客户端生成RSA公钥和私钥.
- 客户端将自己的公钥存放到服务器.
- 客户端请求连接服务器,服务器将一个随机字符串发送给客户端.
- 客户端根据自己的私钥加密这个随机字符串之后再发送给服务器.
- 服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝.这样就不用使用密码了.
-
-
公匙、私匙
- 一个公钥对应一个私钥,可以通过私钥推到出来公钥.
- 加密时,需要两对公私钥对,钥公钥加密数据,对应的私钥解密数据.
- 认证时,私钥加密数据,只有对应的公钥的才可以解开数据.
- 如何防止中间人窃听或者说如何证明和我通话的人就是其本人而不是窃听者?要求和你通话的人提供证书来认证它是不是真正的通话本人.通信时要求对话方提供证书,而后我们使用证书颁发机构的公匙解开由颁发机构用私匙加密过的证书的摘要,进行比对检测是否一致;随后检测下证书中的公匙和通话对方提供的公匙是否一致.
- 在公匙登录原理中,我们会在本地生成RSA密匙对,公私上传到服务器,私匙放在本地的电脑中;当登录需要认证的时候,我们会使用私匙随机生成一串字符,如果服务能够使用公匙解开这串字符就认为登录者是合法的.我的疑惑是加密时由公匙加密数据,用私匙解密;而在公匙登录中我们却使用却使用私匙加密数据,用公匙解密,不是一般只有公匙才可以加密数据吗?
造成上面误解是因为没有分清楚使用场景.加密使用时;先交换通信双方的公匙,而后再通信;签名认证时;通过私匙加密的数据,公匙用户如果能够解密就证明用户是合法的.分场景而定. -
如何防止App被抓包;即使使用Https我们也可以在Charles中设置SSL代理,手机设置信任证书的方式获取数据内容(中间人),找了一些资料大概两种思路:
-
获取iOS系统的代理列表,查看手机是否设置代理,如果设置则禁止接口访问;缺点是存在误判(使用了代理但是没有抓包),还有一点就是使用翻墙软件是不会禁止访问接口;VPN中没有使用代理.
NSURL* hostUrl = [NSURL URLWithString:@"https://www.baidu.com/"]; // 获取系统代理设置 NSDictionary *proxySettings = (__bridge_transfer NSDictionary *)(CFNetworkCopySystemProxySettings()); // 获取请求特定URL的代理列表 NSArray *proxies = (__bridge_transfer NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef)(hostUrl), (__bridge CFDictionaryRef _Nonnull)(proxySettings))); // 遍历代理判断是否使用https for (id proxy in proxies) { if ([[proxy objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeHTTPS"]){ NSLog(@"检测到使用代理"); break; } }
- 把服务证书添加到Bundle中并且设置AFSecurityPolicy验证规则.
参考链接:https://github.com/ChenJing00...
-
- App签名
- 在你的Mac开发机器生成一对公私钥,这里称为公钥L,私钥L.L:Local
- 苹果自己有固定的一对公私钥,跟上面AppStore例子一样,私钥在苹果后台,公钥在每个iOS设备上.这里称为公钥A,私钥A A:Apple
- 把公钥L传到苹果后台,用苹果后台里的私钥A去签名公钥L.得到一份数据包含了公钥L以及其签名,把这份数据称为证书.
- 在苹果后台申请AppID,配置好设备ID列表和APP可使用的权限,再加上第③步的证书,组成的数据用私钥A签名,把数据和签名一起组成一个Provisioning Profile 文件,下载到本地Mac开发机.
- 在开发时,编译完一个APP后,用本地的私钥L对这个APP进行签名,同时把第④步得到的Provisioning Profile文件打包进APP里,文件名embedded.mobileprovision,把APP安装到手机上.
- 在安装时,iOS系统取得证书,通过系统内置的公钥A,去验证 embedded.mobileprovision 的数字签名是否正确,里面的证书签名也会再验一遍.
确保了embedded.mobileprovision里的数据都是苹果授权以后,就可以取出里面的数据,做各种验证,包括用公钥L验证APP签名,验证设备ID是否在ID列表上,AppID是否对应得上,权限开关是否跟APP里的Entitlements对应等.摘自:http://wereadteam.github.io/