转载自: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 信息安全的更多相关文章

  1. iOS 原生库对 https 的处理

    转载自:swift cafe 使用 NSURLSession NSURLSession 是 iOS 原生提供的网络处理库.它提供了丰富的接口以及配置选项,满足我们平时网络处理的大部分需求,同时它也支持 ...

  2. iOS 升级HTTPS通过ATS你所要知道的

    由于苹果规定2017年1月1日以后,所有APP都要使用HTTPS进行网络请求,否则无法上架,因此研究了一下在iOS中使用HTTPS请求的实现.网上搜索了一些比较有用资料,大家可以参考下 苹果强制升级的 ...

  3. iOS开发HTTPS实现之信任SSL证书和自签名证书

    iOS开发HTTPS实现之信任SSL证书和自签名证书 转自:http://www.jianshu.com/p/6b9c8bd5005a/comments/5539345 (收录一下供自己学习用的) 字 ...

  4. iOS升级HTTPS通过ATS你所要知道的

    由于苹果规定2017年1月1日以后,所有APP都要使用HTTPS进行网络请求,否则无法上架,因此研究了一下在iOS中使用HTTPS请求的实现.网上搜索了一些比较有用资料,大家可以参考下 苹果强制升级的 ...

  5. mac 使用apache开启https功能,实现ios局域网内测(二)

    二.创建app.plist 1. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist ...

  6. mac 使用apache开启https功能,实现ios局域网内测(一)

    笔者尝试了网上各种办法最后还是找到了方法解决了一系列局域网内测的问题,随手做个笔记记录下,亲测可行. 一.先生成证书 1.进入apache web 的根目录处理证书命令 cd /Library/Web ...

  7. 一次部署HTTPS的相关事件引发的思考

    前言: 上周五快要下班的时候,突然收到通知客户希望了解一下部署HTTPS的流程,这种事情谁听了都会有几分诧异的.因为这件事虽然和工作有一定的相关度,但平时不会走这个方向,实际上也较少接触.此外,客户手 ...

  8. iOS - Phone 电话

    1.调用电话 1.1 拨打系统电话 调用系统自带的打电话程序,要跳转到打电话程序,打完电话自动跳转回来. 在 iOS9.0 + 系统隐私控制里禁止查询设备中已安装的 App,所以在 iOS9.0 + ...

  9. AFNetworking 原作者都无法解决的问题: 如何使用ip直接访问https网站?

    背景 最近App似乎有报异常是DNS无法解析,尝试解决此问题.搜集到的资料很少,甚至连AFN原作者都判定这可能是一个无解的问题,参见: https://github.com/AFNetworking/ ...

随机推荐

  1. 使用ImageIO.write上传二维码文件时候,提示系统找不到指定路径

    报错如图所示: java.io.FileNotFoundException: E:\SF\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtp ...

  2. 深入理解 DeepSea 和 Salt 部署工具 - Storage6

    学习 SUSE Storage 系列文章 (1)SUSE Storage6 实验环境搭建详细步骤 - Win10 + VMware WorkStation (2)SUSE Linux Enterpri ...

  3. gitbook 入门教程之小白都能看懂的 Gitbook 插件开发全流程

    什么是插件 Gitbook 插件是扩展 GitBook 功能(电子书和网站)的最佳方式. 只要是 Gitbook 默认没有提供的功能,基于插件机制都可以自行扩展,是插件让 Gitbook 变得更加强大 ...

  4. git 工作流中的 Sourcetree 和命令行操作对比

    git 工作流操作 1.初始化本地仓库文件夹 终端进入项目文件夹 git init 隐藏文件夹中有 .git 文件夹则初始化成功 2.git 查看仓库状态 这里以新建一个 demo.txt 为例 ① ...

  5. JAVA MyBatis配置文件用properties引入外部配置文件

    方式一:通过properties 元素的子元素来传递数据 例如: <properties> <property name="driver" value=" ...

  6. yii2 rules 规则

    required : 必须值验证属性 [['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredV ...

  7. 并发新构件之CyclicBarrier

    CyclicBarrier:叫做循环栅栏,名字挺好听的.JDK描述:允许一组线程全部等待彼此达到共同屏障点的同步辅助. 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此. 屏障被 ...

  8. 由一次线上故障来理解下 TCP 三握、四挥 & Java 堆栈分析到源码的探秘

    本文导读: 生产故障场景介绍 TCP 建连三次握手过程 TCP 断连四次挥手过程 结合 Java 堆栈剖析源码 再从堆栈中找到"罪魁祸首" 问题优化方案总结 1.生产故障场景介绍 ...

  9. 配置VC++2010的glut库

    VC++2010是一个成熟稳定的版本,微软的编译工具Visual Studio系列从VC6到如今的VC2019,功能非常强大,我们在开始学习C++和计算机图形学的时候,一般入手<<C++P ...

  10. 算法学习之剑指offer(七)

    题目1 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P% ...