Https 与 iOS 信息安全
转载自:swift-cafe
什么是
Https
咱们从最直观的说起。 我们平时在用电脑访问网页的时候,有时候会在地址栏的左边多出一个小锁的图标,就像这样:
这是大多数主流浏览器的一个通用做法,当我们看到这个锁的时候,基本上就说明我们访问的这个网站是基于 Https 协议的了。
那么 Https 到底和我们熟知的 Http 有什么区别呢? 主要的区别就是信息的安全加密。 使用 Https 传输的数据是经过加密的, 而 Http 不会加密。
那么为什么需要对网络请求加密呢? 这就涉及到互联网的基本原理了。 大家知道,客户端的一个网络请求发出去,不是直接送达到我们的服务器的。 这中间要经过很多环节, 比如路由器,网关,运营商的基站等等。
我们的一个网络请求发出去,其实是这样一个流程:
如果是基于 Http 协议,那么我们网络通信的内容,除了终端和服务器之外,中间经过的所有路由器或者其他节点都是可以看到的。甚至它们还可以篡改这些信息。
这样说起来可能有些抽象,还是举一个通俗的例子, 比如访问我们的网站 swiftcafe.io,采用 Http 的流程是这样,客户端发送 Http 请求,包含了我们访问的 url, 比如这篇文章的地址。
当服务器收到这个请求的时候,根据它的规则给我们返回相应的内容,在我们这里就是这个地址的页面信息。 但由于是基于 Http 协议,无论是我们发送的请求内容,还是服务器返回的响应内容,都是可以被中间节点修改的。 假设途径某个路由器,它在服务端响应的网页内容中又注入它自己的内容,比如一段广告的 html 代码。那么最终返回给我们客户端的就不是服务器原本希望我们看到的内容了。 而是被这个中间路由器加了广告的页面了。
大家仔细想想,是不是在我们平时上网的时候,或多或少会遇到过这种情况呢,这个时候我们的信息其实就已经被监听和篡改了。被偷偷的加了广告还算是好的,甚至有些时候用户的一些隐私信息也会被这样偷走。
还是用一张图来表示:
Https
实现原理
如果你是第一次了解这个原理,会不会觉得自己在上网的时候时刻处在危机中呢? 反正我是这样~,目前互联网上,大多数网站还都是基于 Http 协议的。尤其是国内的互联网。那么为什么当初会有 Http 这样不安全的协议呢?
我想主要原因是互联网刚刚诞生的时候,网站的逻辑都很简单,那时候大多数网站都只是一个简单的信息展现,并不涉及太多的交互和隐私数据。而且 Http 协议相比之下性能消耗小,协议实现起来简单,所以在那个时代 Http 是主流的应用。可随着互联网应用的形式发展的越来越快,现在的网站交互行为越来越多,涉及用户隐私的地方也越来越多,以及近几年移动互联网的兴起,还有 App 的数据接口也需要安全处理。这时 Http 协议就已经不太符合我们现在对于安全的需求了。 这也是 Https 开始应用的原因。
现在支持 Https 的网站已经越来越多了。 这也会是未来的一个趋势。
证书验证
现在我们就来了解一下 Https 的基本原理。
Https 是一种基于证书的加密连接。 应用服务器首先会向证书颁发机构申请一个数字证书。这个证书颁发机构一般是一些比较大的组织,比如 Godaddy, Comodo, Symantec 这些公司。
当我们客户端访问 https:// 开头的地址的时候。先会和服务器进行一次 "握手操作"。 服务器会把它的证书返回给客户端,比如我们电脑上的浏览器。
然后客户端会验证这个证书是不是可信任的,如果是可信任的才会进行下一步操作。
那么问题来了,什么样的证书才是可信任的呢, 这就涉及到证书的数字签名过程了。 我们前面提到的证书颁发机构都会有一个根证书,根证书上面会有两个秘钥,一个公钥一个私钥。公钥是公开的,而私钥只有颁发机构才会知道。 然后证书颁发机构会用根证书的私钥为它签发的子证书中的整体内容进行加密,然后生成数字签名,并且包含到这个子证书中,同时子证书中也会包含自己的公钥和私钥。 这样一来,我们在进行 Https 握手的时候,服务器发送给我们的证书中会带有数字签名, 我们在用颁发机构的公钥对数字签名进行解密,如果解密后的内容和证书本身的内容能够完全匹配,那么我们就可以信任这个证书了。
因为数字签名只有证书颁发机构用它的私钥才能够生成,所以第三方是不能伪造的,除非它能知道颁发机构的私钥。公钥-私钥的这种加密方式,我们称之为非对称加密。也就是说加密和解密过程使用的密钥是不同的。
通信加密
那么客户端验证成功后,接下来会做什么呢。由于非对称加密会比较消耗性能,我们只在握手的时候才会进行非对称加密,此后的 Https 消息中,我们还是采用对称加密的形式。
客户端在验证证书可信后,紧接着会生成一个对称加密的密钥,然后用这个证书的公钥对这个生成的秘钥再进行加密,发送给服务器。 当服务器接到这个加密的信息后,用它自己的私钥进行解密,这样就得到了此后的对称加密算法的秘钥了。又由于服务器证书的私钥只有服务器自己知道,中途的其他节点即便获取到了这段信息,也没办法解密出来。这样就保证了我们此后的对称加密的密钥不会被第三方截获。
上几张图就更明白了:
怎么样明白了吧。 没关系,没明白再仔细看看, 会明白的~ Https 协议的设计非常有艺术性,上面两幅图基本就是 Https 的握手过程了。 握手过后,客户端和服务器都拥有了对称加密的密钥,而这个对称加密的密钥是基于非对称加密的方式传输的。总之就是,这个密钥除了客户端和服务器,其他中间节点是无法知道的。
握手过后,接下来的网络请求的格式和基本的 Http 就没什么区别了,只是将所有的消息用对称加密的密钥进行加密,然后服务器再进行解密了。 因为这个密钥不会被第三方知道, 所以你们的通信就是安全的。
结尾
经过这么一番论述,我们把 Https 的基本原理,以及为什么要使用 Https 都和大家介绍了。 当然, Https 的很多实现细节我们这里并没有深入的讨论,而且任何一个安全机制也都不一定绝对安全。 但 Https 确实能够在很大程度上保护用户的隐私信息。接下来,我会和大家一起讨论在 iOS 中如何处理 Https 相关操作的方法。
Https 与 iOS 信息安全的更多相关文章
- iOS 原生库对 https 的处理
转载自:swift cafe 使用 NSURLSession NSURLSession 是 iOS 原生提供的网络处理库.它提供了丰富的接口以及配置选项,满足我们平时网络处理的大部分需求,同时它也支持 ...
- iOS 升级HTTPS通过ATS你所要知道的
由于苹果规定2017年1月1日以后,所有APP都要使用HTTPS进行网络请求,否则无法上架,因此研究了一下在iOS中使用HTTPS请求的实现.网上搜索了一些比较有用资料,大家可以参考下 苹果强制升级的 ...
- iOS开发HTTPS实现之信任SSL证书和自签名证书
iOS开发HTTPS实现之信任SSL证书和自签名证书 转自:http://www.jianshu.com/p/6b9c8bd5005a/comments/5539345 (收录一下供自己学习用的) 字 ...
- iOS升级HTTPS通过ATS你所要知道的
由于苹果规定2017年1月1日以后,所有APP都要使用HTTPS进行网络请求,否则无法上架,因此研究了一下在iOS中使用HTTPS请求的实现.网上搜索了一些比较有用资料,大家可以参考下 苹果强制升级的 ...
- mac 使用apache开启https功能,实现ios局域网内测(二)
二.创建app.plist 1. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist ...
- mac 使用apache开启https功能,实现ios局域网内测(一)
笔者尝试了网上各种办法最后还是找到了方法解决了一系列局域网内测的问题,随手做个笔记记录下,亲测可行. 一.先生成证书 1.进入apache web 的根目录处理证书命令 cd /Library/Web ...
- 一次部署HTTPS的相关事件引发的思考
前言: 上周五快要下班的时候,突然收到通知客户希望了解一下部署HTTPS的流程,这种事情谁听了都会有几分诧异的.因为这件事虽然和工作有一定的相关度,但平时不会走这个方向,实际上也较少接触.此外,客户手 ...
- iOS - Phone 电话
1.调用电话 1.1 拨打系统电话 调用系统自带的打电话程序,要跳转到打电话程序,打完电话自动跳转回来. 在 iOS9.0 + 系统隐私控制里禁止查询设备中已安装的 App,所以在 iOS9.0 + ...
- AFNetworking 原作者都无法解决的问题: 如何使用ip直接访问https网站?
背景 最近App似乎有报异常是DNS无法解析,尝试解决此问题.搜集到的资料很少,甚至连AFN原作者都判定这可能是一个无解的问题,参见: https://github.com/AFNetworking/ ...
随机推荐
- layui select获取自定义属性值
layui-select写法: <option value='> 我想在点击的时候获取自定义属性data-method的值,其中selectId是该select的id form.on('s ...
- .net core 3.0 Signalr - 05 使用jwt将用户跟signalr关联
Signalr是以Group.Connect为核心来进行推送,比如,给某个组.某个连接来推送,但实际场景中,核心应该是某个组.某个人:然而一个人可以对应多个连接(浏览器多个tab页):本节就来介绍下自 ...
- Mysql高手系列 - 第19篇:mysql游标详解,此技能可用于救火
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第19篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- docker在Mac上的下载安装
在Mac上下载安装docker,下载链接:Stable 安装成功后启动终端,检查安装后的docker版本: yanguobindeMacBook-Pro:~ yanguobin$ docker --v ...
- python编程基础之十九
字符串判断常用函数: str.isalpha() # 判断是否是全字母 str.isdigit() # 判断是否是全数字 str.isalnum() # 判断是否是字母和数字组合 str.is ...
- Creator3D 守护你的球球—UV动画与天空盒
1 游戏预览 在线体验地址:http://example.creator-star.cn/follo-ball/ 2 场景物体 场景物体 新建场景后,引擎会为我们创建默认的摄像机和灯光,这个我们就不介 ...
- dubbo配置文件的加载顺序详解(图示)
Dubbo配置文件的加载顺序 在使用apache dubbo.version2.7.3 时,配置文件的加载情况.以provider提供服务者为例. 配置文件 ,以下四个配置文件. 其优先级 app ...
- C# MQTT mqtt客户端,发布订阅消息
如果想用C#来和mqtt的服务器进行数据交互的话,有一个常见的选择,那就是 MQTTNET 地址如下:https://github.com/chkr1011/MQTTnet 那个库在最近几个版本升级的 ...
- 一个最简单的springboot
现在项目里使用springboot,平时开发并不太关注springboot的一些基本配置,现在想整理一下springboot相关内容. 实际开发中都会因为各种业务需求在springboot上添加很多东 ...
- shark恒破解笔记4-API断点GetPrivateProfileStringA
这小节是通过断在GetPrivateProfileStringA,然后找到注册码的. 1.运行程序输入假码111111,提示重启.通过这判断这是一个重启来验证的,那么它是如何来验证的呢?观察程序目录下 ...