投递人 itwriter 发布于 2017-02-27 21:35 评论(10) 有1957人阅读 原文链接 [收藏] « »

  HTTPS 是建立在密码学基础之上的一种安全通信协议,严格来说是基于 HTTP 协议和 SSL/TLS 的组合。理解 HTTPS 之前有必要弄清楚一些密码学的相关基础概念,比如:明文、密文、密码、密钥、对称加密、非对称加密、信息摘要、数字签名、数字证书。接下来我会逐个解释这些术语,文章里面提到的『数据』、『消息』都是同一个概念,表示用户之间通信的内容载体,此外文章中提到了以下几个角色:

  • Alice:消息发送者
  • Bob:消息接收者
  • Attacker:中间攻击者
  • Trent:第三方认证机构

密码

  密码学中的“密码”术语与网站登录时用的密码(password)是不一样的概念,password 翻译过来其实是“口令”,它是用于认证用途的一组文本字符串。

  而密码学中的密码(cipher)是一套算法(algorithm),这套算法用于对消息进行加密和解密,从明文到密文的过程称之为加密,密文反过来生成明文称之为解密,加密算法与解密算法合在一起称为密码算法。

密钥

  密钥(key)是在使用密码算法过程中输入的一段参数。同一个明文在相同的密码算法和不同的密钥计算下会产生不同的密文。很多知名的密码算法都是公开的,密钥才是决定密文是否安全的重要参数,通常密钥越长,破解的难度越大,比如一个 8 位的密钥最多有 256 种情况,使用穷举法,能非常轻易的破解。根据密钥的使用方法,密码可分为对称加密和公钥加密。

对称加密

  对称密钥(Symmetric-key algorithm)又称为共享密钥加密,加密和解密使用相同的密钥。常见的对称加密算法有 DES、3DES、AES、RC5、RC6。对称密钥的优点是计算速度快,但是它有缺点,接收者需要发送者告知密钥才能解密,因此密钥如何安全的发送给接收者成为了一个问题。

  Alice 给 Bob 发送数据时,把数据用对称加密后发送给 Bob,发送过程中由于对数据进行了加密,因此即使有人窃取了数据也没法破解,因为它不知道密钥是什么。但是同样的问题是 Bob 收到数据后也一筹莫展,因为它也不知道密钥是什么,那么 Alice 是不是可以把数据和密钥一同发给 Bob 呢。当然不行,一旦把密钥和密钥一起发送的话,那就跟发送明文没什么区别了,因为一旦有人把密钥和数据同时获取了,密文就破解了。所以对称加密的密钥配是个问题。如何解决呢,公钥加密是一个办法。

公钥加密

  公开密钥加密(public-key cryptography)简称公钥加密,这套密码算法包含配对的密钥对,分为加密密钥和解密密钥。发送者用加密密钥进行加密,接收者用解密密钥进行解密。加密密钥是公开的,任何人都可以获取,因此加密密钥又称为公钥(public key),解密密钥不能公开,只能自己使用,因此它又称为私钥(private key)。常见的公钥加密算法有 RSA。

  还是以 Alice 给 Bob 发送数据为例,公钥加密算法由接收者 Bob 发起

  1. Bob 生成公钥和私钥对,私钥自己保存,不能透露给任何人。
  2. Bob 把公钥发送给 Alice,发送过程中即使被人窃取也没关系
  3. Alice 用公钥把数据进行加密,并发送给 Bob,发送过程中被人窃取了同样没关系,因为没有配对的私钥进行解密是没法破解的
  4. Bob 用配对的私钥解密。

  虽然公钥加密解决了密钥配送的问题,但是你没法确认公钥是不是合法的,Bob 发送的公钥你不能肯定真的是 Bob 发的,因为也有可能在 Bob 把公钥发送给 Alice 的过程中出现中间人攻击,把真实的公钥掉包替换。而对于 Alice 来说完全不知。还有一个缺点是它的运行速度比对称加密慢很多。

消息摘要

  消息摘要(message digest)函数是一种用于判断数据完整性的算法,也称为散列函数或哈希函数,函数返回的值叫散列值,散列值又称为消息摘要或者指纹(fingerprint)。这种算法是一个不可逆的算法,因此你没法通过消息摘要反向推倒出消息是什么。所以它也称为单向散列函数。下载软件时如何确定是官方提供的完整版呢,如果有中间人在软件里面嵌入了病毒,你也不得而知。所以我们可以使用散列函数对消息进行运算,生成散列值,通常软件提供方会同时提供软件的下载地址和软件的散列值,用户把软件下载后在本地用相同的散列算法计算出散列值,与官方提供的散列值对比,如果相同,说明该软件是完成的,否则就是被人修改过了。常用的散列算法有 MD5、SHA。  

  下载 Eclipse 时,官方网站同时提供了软件地址和消息摘要

  散列函数可以保证数据的完整性,识别出数据是否被篡改,但它并不能识别出数据是不是伪装的,因为中间人可以把数据和消息摘要同时替换,数据虽然是完整的,但真实数据被掉包了,接收者收到的并不是发送者发的,而是中间人的。消息认证是解决数据真实性的办法。认证使用的技术有消息认证码和数字签名。

消息认证码

  消息认证码(message authentication code)是一种可以确认消息完整性并进行认证(消息认证是指确认消息来自正确的发送者)的技术,简称 MAC。消息认证码可以简单理解为一种与密钥相关的单向散列函数。

  Alice 给 Bob 发送消息前,先把共享密钥(key)发送给 Bob,Alice 把消息计算出 MAC 值,连同消息一起发送给 Bob,Bob 接收到消息和 MAC 值后,与本地计算得到 MAC 值对比,如果两者相同,就说明消息是完整的,而且可以确定是 Alice 发送的,没有中间人伪造。不过,消息认证码同样会遇到对称加密的密钥配送问题,因此解决密钥配送问题还是要采用公钥加密的方式。

  此外,消息认证码还有一个无法解决的问题,Bob 虽然可以识别出消息的篡改和伪装,但是 Alice 可以否认说:“我没发消息,应该是 Bob 的密钥被 Attacker 盗取了,这是 Attacker 发的吧”。Alice 这么说你还真没什么可以反驳的,那么如何防止 Alice 不承认呢,数字签名可以实现。

数字签名

  Alice 发邮件找 Bob 借 1 万钱,因为邮件可以被人篡改(改成 10 万),也可以被伪造(Alice 根本就没发邮件,而是 Attacker 伪造 Alice 在发邮件),Alice 借了钱之后还可以不承认(不是我借的,我没有签名啊)。

  消息认证码可以解决篡改和伪造的问题,Alice 不承认自己借了钱时,Bob 去找第三方机构做公正,即使这样,公正方也没法判断 Alice 有没有真的借钱,因为他们俩共享了密钥,也就是说两个都可以计算出正确的 MAC 值,Bob 说:“明明你发的消息和 MAC 值和我自己生成的 MAC 值一样,肯定是你发的消息”,Alice 说:“你把密钥透露给了其他人,是他发的邮件,你找他去吧”。Alice 矢口否认。

  数字签名(Digital Signature)就可以解决否认的问题,发送消息时,Alice 和 Bob 使用不同的密钥,把公钥加密算法反过来使用,发送者 Alice 使用私钥对消息进行签名,而且只能是拥有私钥的 Alice 可以对消息签名,Bob 用配对的公钥去验证签名,第三方机构也可以用公钥验证签名,如果验证通过,说明消息一定是 Alice 发送的,抵赖也不行,因为你只有 Alice 可以生成签名。这就防止了否认的问题。

  它的流程是:

  第一步:发送者 Alice 把消息哈希函数处理生成消息摘要,摘要信息使用私钥加密之后生成签名,连同消息一起发送给接收者 Bob。

  第二步:数据经过网络传输,Bob 收到数据后,把签名和消息分别提取出来。

  第三步:对签名进行验证,验证的过程是先把消息提取出来做同样的 Hash 处理,得到消息摘要,再与 Alice 传过来的签名用公钥解密,如果两者相等,就表示签名验证成功,否则验证失败,表示不是 Alice 发的。

公钥证书

  公钥密码在数字签名技术里面扮演举足轻重的角色,但是如何保证公钥是合法的呢,如果是遭到中间人攻击,掉包怎么办?这个时候公钥就应该交给一个第三方权威机构来管理,这个机构就是认证机构(Certification Authority)CA,CA 把用户的姓名、组织、邮箱地址等个人信息收集起来,还有此人的公钥,并由 CA 提供数字签名生成公钥证书(Public-Key Certificate)PKC,简称证书。

  Alice 向 Bob 发送消息时,是通过 Bob 提供的公钥加密后的数据,而 Alice 获取的公钥并不是由 Bob 直接给的,而是由委托一个受信任的第三方机构给的。

  1. Bob 生成密钥对,私钥自己保管,公钥交给认证机构 Trent。
  2. Trent 经过一系列严格的检查确认公钥是 Bob 本人的
  3. Trent 事先也生成自己的一套密钥对,用自己的私钥对 Bob 的公钥进行数字签名并生成数字证书。证书中包含了 Bob 的公钥。公钥在这里是不需要加密的,因为任何人获取 Bob 的公钥都没事,只要确定是 Bob 的公钥就行。
  4. Alice 获取 Trent 提供的证书。
  5. Alice 用 Trent 提供的公钥对证书进行签名验证,签名验证成功就表示证书中的公钥是 Bob 的。
  6. 于是 Alice 就可以用 Bob 提供的公钥对消息加密后发送给 Bob。
  7. Bob 收到密文后,用与之配对的私钥进行解密。

  至此,一套比较完善的数据传输方案就完成了。HTTPS(SSL/TLS)就是在这样一套流程基础之上建立起来的。

本文首发于公众号『一个程序员的微站』(id:VTtalk),分享 Python 等技术干货和有温度的内容,欢迎关注
博客地址:https://foofish.net/https-story-1.html

HTTPS为什么更安全,先看这些 , 网络加密 , 加密解密相关推荐

  1. 无线网络安全:看无线网络各类加密模式

    要想在无线网络里放心冲浪,对其加密是保障无线网络安全的一种方法.这里就为大家介绍几种无线加密模式. WEP(有线等效加密) 尽管从名字上看似乎是一个针对有线网络的安全选项,其实并不是这样.WEP标准在 ...

  2. 网络篇 - https协议中的数据是否需要二次加密

    随着互联网整体的发展,https 也被越来越多的应用.甚至苹果去年还曾经放言要强制所有的 app 都使用 https,可见在如今的互联网它的重要性.前面的文章说了 OSI 七层模型,https 可以保 ...

  3. 从【连接受限】看Android网络

    从连接受限看Android网络 现象 摸索 从通知开始 是Handler发的通知 看看NetworkStateTrackerHandler NetworkMonitor做了什么 NetworkMoni ...

  4. HTTP和HTTPS HTTPS为什么更安全?

    文章目录 HTTP和HTTPS HTTPS保证安全性的做法 1.混合加密机制,加密HTTP的通信内容 数字签名 实现数据完整性验证 使用数字证书证明身份 HTTP和HTTPS的区别 HTTP和HTTP ...

  5. 刘润:五维思考,让你站得更高、看得更远

    原标题:刘润:五维思考,让你站得更高.看得更远 前言:遇到问题时,有的人很快就能想明白,有的人需要很久才能想明白,还有的人始终都想不明白. 而且,那些很快就能想明白的人,发现不管自己怎么努力,都很难帮 ...

  6. tensorflow2.3实现PPLCNet——一个速度更快、准确率更高的轻量级骨干网络

    1. 前言 PPLCNet是百度团队结合Intel-CPU端侧推理特性而设计的轻量高性能网络PP-LCNet,所提方案在图像分类任务上取得了比ShuffleNetV2.MobileNetV2.Mobi ...

  7. 看天下网络资讯浏览器 下载

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  8. 一个动画看懂网络原理之CSMA/CD的工作原理

    一个动画看懂网络原理之CSMA/CD的工作原理 CSMA/CD协议是以太网传输中的一个重要协议,由于线路中同一时间只能允许一台电脑发送信息,否则各计算机之间就会产生干扰,为了解决这个问题,采用了CSM ...

  9. 计算机网络原理fin,一个动画看懂网络原理之TCP建立和释放过程

    一个动画看懂网络原理之TCP建立和释放过程 一.TCP的概念 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.T ...

  10. 网络安全从业者必看 注册网络安全等级测评工程师考证解读

    <中华人民共和国网络安全法>第二十一条规定国家实行网络安全等级保护制度.网络运营者应当按照网络安全等级保护制度的要求,保障网络免受干扰.破坏或者未经授权的访问,防止网络数据泄露或者被窃取 ...

最新文章

  1. FLUSH TABLES WITH READ LOCK 和 LOCK TABLES
  2. mysql忘记root密码解决方法(版本mysql-8.0.12)
  3. 用Memcache守护程序把数据缓存到内存二
  4. flutter刷新页面_Flutter BottomNavigationBar切换会刷新当前页面解决方
  5. PAT 1152 Google Recruitment (20 分)- 甲级
  6. oracle数据库集群日志,Oracle集群数据库中恢复归档日志
  7. mybatis 使用merge into
  8. 摩托罗拉ex232java_摩托罗拉ex232r如何刷机?摩托罗拉ex232r评测
  9. html如何创建关键帧动画旋转,[教程] 用 CSS3 Animations(动画) 和 Keyframes(关键帧) 创建简单的网页动画 – CSS3 实现弹跳球动画...
  10. Ubuntu Sublime Text 3 搜狗拼音
  11. Python脚本实现启停app获取资源占比信息
  12. 都是自私惹的祸? 论蹭网再触道德底线
  13. SpringBoot+Vue.js实现大文件分片上传、断点续传与极速秒传
  14. verilog语法记录(一)
  15. 苹果iphone免越狱使用iTunes获取旧版本APP
  16. java在线电影_java在线高清
  17. .bat脚本执行cmd命令
  18. Ambari-Agent心跳丢失:Failed to connect to https://xx.xx.xx:8440/ca due to
  19. 企业生产计划排产该如何制定
  20. 【一本通】1148-连续出现的字符

热门文章

  1. phpexcel 导入导出
  2. 从Linux程序中执行shell(程序、脚本)并获得输出结果(转)
  3. thinkphp生成php文件,thinkphp使用buildHtml生成静态文件的方法
  4. 漫画:Bitmap算法
  5. OpenCV---Canny边缘提取
  6. freeswitch被叫忙处理
  7. vc ctabctrl页面切换事件_10191025一周PE/VC事件回顾|猿辅导获得10亿美元G2轮融资
  8. 1.3.2 Barn Repair 修理牛棚
  9. scala正则表达式 findFirstIn findAllIn findFirstMatchIn findAllMatchIn Match MatchData 提取分组
  10. vs 生成get set_使用EasyCode+Lombok快速生成增删查改的代码