- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
前面我们花了很大的篇幅来讲HTTP在性能上的改进,从1.0到1.1,再到2.0、3.0,HTTP通过替换底层协议,解决了一直阻塞性能提升的队头阻塞问题,在性能上达到了极致.
那么,接下来,我们来聊一聊HTTP在安全上都做了哪些事情,HTTPS是如何帮助HTTP解决安全问题的.
那为什么要有HTTPS呢?其本质原因就是因为我们之前说过的哈,因为HTTP是不安全的。它明文的特点,虽然给我们的学习带来了一定的便利性,但是也正是因为如此,在整个报文的传输过程中,任何人都能在链路中访问、截获、修改或者伪造请求/响应的数据.
比如,就拿前两篇文章讲的代理服务。它作为 HTTP 通信的中间人,在数据上下行的时候可以添加或删除部分头字段,也可以使用黑白名单过滤 body 里的关键字,甚至直接发送虚假的请求、响应,而浏览器和源服务器都没有办法判断报文的真伪.
这对于网络购物、网上银行、证券交易等需要高度信任的应用场景来说是非常致命的。如果没有基本的安全保护,使用互联网进行各种电子商务、电子政务就根本无从谈起.
对于安全性不那么高的门户网站、新闻网站、视频网站等,也可能会在页面中嵌入广告,分流用户,致使网站损失.
对于我们普通人来说,危害性更大,不知不觉,你的隐私信息就被泄露,甚至威胁人身和财产安全.
我们想象一下,就像《三体》小说中的黑暗森林定义,他人即地狱,所有的一切都是不可靠,不可信的.
所以,保证HTTP报文的数据安全,成了一件必然且急迫的事情.
首先,我们想要建立安全,有一个前提,就是我们要先知道什么是安全。那什么样的通信过程才算是“安全”呢?
通常认为,如果通信过程具备了四个特性,就可以认为是“安全”的,这四个特性是: 机密性、完整性,身份认证和不可否认 .
机密性 (Secrecy/Confidentiality),是指对数据的保密,只能由可信的人访问,对其他人是不可见的”秘密“,简单的说就是不能让不相关的人看到不该看的东西。比如战争时代,电台传递的信息都是加密的,然后传递的终端的接收人里会有个密码本,根据密码本来解密传递的加密信息,如果这个密码本被敌军获取或者破解,你的策略和方针就毫无秘密可言.
完整性 (Integrity),也叫做一致性,是指数据在传输过程中没有被篡改,不多也不少,”完完整整“的发送给对方。机密性虽然可以保证让数据保密,但是并不能防止数据被改动,假如黑客在获取大量加密数据后,通过碰撞碰撞出某些关键字,那么黑客就可以替换其中一部分数据,或者调整顺序,破坏通信数据的可靠性.
身份认证 (Authentication),是指确认对方的真实身份,也就是”怎么证明你真的是你“,保证消息之发送给可信的人。如果通信时另外一方是一个假冒网站,那么数据再保密再完整也没用,黑客完全可以使用冒充的身份套出各种信息,加密不加密,完整不完整,没啥意义,因为你最终的接收人就是不可靠的.
那么在现实生活中,你怎么证明你是你呢?嗯……身份证呗。我们后面就会详细的说一下网站的身份证是如何工作的.
不可否认 (Non-repudiation/Undeniable),也叫做不可抵赖,意思是不能否认已经发生过的行为,不能说话不算数,不认账.
使用前三个特性,可以解决安全通信的大部分问题,但是如果缺少了不可否认,那通信的事务的真实性就得不到保证,有可能出现说话不负责的情况.
所以,只有同时具备了 机密性、完整性、身份认证、不可否认 四个特性,通信双方的利益才能得到保障,才能算得上是真正的安全.
那什么是HTTPS?一句话,就是为HTTP增加了安全通信的四大特性.
其实HTTPS特别简单,RFC文档只有7页,里面规定了新的协议名 https , 默认端口号是443 ,至于其它的请求-应答模型、报文结构、请求方法、URI、头字段、连接管理等等都完全沿用HTTP,没有任何新的东西.
也就是说,HTTPS除了在安全上的改进,它拥有HTTP一切的优缺点,一模一样,没区别.
那HTTPS是如何做到安全的四大特性的呢?嗯……就是多出来的那个S.
它把HTTP下层的传输协议由TCP/IP换成了SSL/TLS,由”HTTP over TCP/IP“变成了”HTTP over SSL/TLS“,让HTTP运行在了安全的SSL/TLS协议上,收发报文不再使用Socket API,而是调用专门的安全接口.
所以说,其实HTTPS并没有啥特别的地方,全是靠SSL/TLS来支持。我们只要学会了SSL/TLS,HTTPS自然就手到擒来了.
SSL即安全套接层(Secure Sockets Layer),在OSI模型中处于第5层,也就是会话层,由网景公司于 1994 年发明,有 v2 和 v3 两个版本,而 v1 因为有严重的缺陷从未公开过.
SSL 发展到 v3 时已经证明了它自身是一个非常好的安全通信协议,于是互联网工程组 IETF 在 1999 年把它改名为 TLS(传输层安全,Transport Layer Security),正式标准化,版本号从 1.0 重新算起,所以 TLS1.0 实际上就是 SSLv3.1.
到今天 TLS 已经发展出了三个版本,分别是 2006 年的 1.1、2008 年的 1.2 和2018年的 1.3,每个新版本都紧跟密码学的发展和互联网的现状,持续强化安全和性能,已经成为了信息安全领域中的权威标准.
目前应用的最广泛的 TLS 是 1.2,而之前的协议(TLS1.1/1.0、SSLv3/v2)都已经被认为是不安全的,各大浏览器即将在 2020 年左右停止支持,所以接下来的讲解都针对的是 TLS1.2.
TLS 由记录协议、握手协议、警告协议、变更密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密码学前沿技术.
浏览器和服务器在使用 TLS 建立连接时需要选择一组恰当的加密算法来实现安全通信,这些算法的组合被称为“密码套件”(cipher suite,也叫加密套件).
其实 TLS 的密码套件命名非常规范,格式很固定。基本的形式是“密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法”,比如”ECDHE-RSA-AES256-GCM-SHA384“的密码套件的意思就是:
“握手时使用 ECDHE 算法进行密钥交换,用 RSA 签名和身份认证,握手后的通信使用 AES 对称算法,密钥长度 256 位,分组模式是 GCM,摘要算法 SHA384 用于消息认证和产生随机数。” 。
聊完了TLS,我们就不得不谈一下OpenSSL,它是一个著名的开源密码学程序库和工具包,几乎支持所有公开的加密算法和协议,已经成为了事实上的标准,许多应用软件都会使用它作为底层库来实现 TLS 功能,包括常用的 Web 服务器 Apache、Nginx 等.
OpenSSL 是从另一个开源库 SSLeay 发展出来的,曾经考虑命名为“OpenTLS”,但当时(1998 年)TLS 还未正式确立,而 SSL 早已广为人知,所以最终使用了“OpenSSL”的名字.
由于 OpenSSL 是开源的,所以它还有一些代码分支,比如 Google 的 BoringSSL、OpenBSD 的 LibreSSL,这些分支在 OpenSSL 的基础上删除了一些老旧代码,也增加了一些新特性,虽然背后有“大金主”,但离取代 OpenSSL 还差得很远.
本篇,最重要的就是安全通信的四大特性,这个东西大家一定要记住,我们后面的学习都是基于此的TLS实现。我们还了解了其实HTTPS的核心就是S,而S其实就是SSL和TLS,而SSL又是TLS的前身,所以根本的学习,就来到了TLS。而OpenSSL就是TLS的具体实现.
最后此篇关于真正“搞”懂HTTPS协议15之安全的定义的文章就讲到这里了,如果你想了解更多关于真正“搞”懂HTTPS协议15之安全的定义的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在complier.h中有一个宏定义如下: # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) 但是这里我有一个问题,就是哪里
curl_easy_setopt 的选项在哪里?定义?我试图寻找 CURLOPT_VERBOSE 和其他一些整数值,但这些似乎没有在 curl.h 中明确定义。 最佳答案 第 792 行: #ifde
我确实有一个如下所示的类(class): //.h file class __declspec(dllimport) MyClass { public: //stuff pri
作者: zhuwenzhuang, 2024.05.08. 阅读前假设读者熟悉数据库使用,了解 SQL 的语法和关系算子的大概含义, 能通过 EXPLAIN 命令查看数据库执行计划. 0 前言
我似乎无法找到是否可以声明一个 header 对象以便在响应 header 中重用它,有一些示例定义了响应模式的对象,但它不会转置为响应 header 。我只设法制作了一个可重用的响应对象,如下所示:
css 选择器 * + * 实际上是什么意思?当您执行检查元素时,您可以在谷歌浏览器的控制台中看到它。在我看来,这似乎是对 "Every second child"应用一种风格,但仍然想确定。谁能帮我
我试图弄清楚基本的IO Haskell 函数是定义好的,所以我使用了this reference我到了putChar函数定义: putChar :: Char -> IO () putChar
我得到了一个自动生成的文件,该文件定义了程序集属性,我正在尝试理解内容。 [assembly: global::System.Runtime.Versioning.TargetFrameworkAtt
This文档演示了如何检查变量是否先前已在 gnuplot 脚本中定义。 文档中的示例: a = 10 if (exists("a")) print "a is defined" if (!exist
好吧,这是一个相当基本的问题:我正在关注 SICP 视频,我对 define、let 和 之间的区别有点困惑设置!. 1) 根据 Sussman 在视频中的说法,define 只允许为变量附加一个值一
我一直在尝试定义一个包含只能具有以下三个值之一的字段的 XSD: 绿色 红色 蓝色 本质上,我想在架构级别定义严格的枚举。 我的第一次尝试似乎是错误的,我不确定修复它的“正确”方法。
有人可以定义“POCO”到底是什么意思吗?我越来越频繁地遇到这个术语,我想知道它是否仅与普通类有关还是意味着更多? 最佳答案 “普通旧式 C# 对象” 只是一个普通的类,没有描述基础结构问题或域对象不
在我经常看到的一些django模型中 myfield = models.CharField(_('myfield')) class_name = models.CharField(_('Type'),
每当 BOOL 数据类型不容易预定义时,我都会使用以下定义进行 boolean 运算, typedef unsigned char BOOL; (由于内存使用)。 我意识到出于性能原因,使用本地总线宽
l_ABC_BEANVector = utilRemote.fnGetVector("ABC_COVBEANVector"); 编码的含义是什么?任何帮助,我真的很感激。谢谢 最佳答案 唯一可以肯定地
我正在使用 javacc 开发一个项目,我遇到问题并需要一些帮助,我的文件中有这样的内容: STRING COPYRIGHT (C) 2003, 2004 SYNOPSYS, INC.; 我为单词 S
我想弄清楚基本的 IO定义了 Haskell 函数,所以我使用了 this reference然后我到了 putChar函数定义: putChar :: Char -> IO () putCha
我在具体类中使用 @property 定义 getter 时遇到问题。这是Python代码: from abc import ABCMeta, abstractproperty class abstr
我正在为大学用 C 语言编写一个小游戏,但我陷入了困境。我(在头文件中)有这个结构: typedef struct{ game_element field[MAX_ROWS][MAX_COLU
我一直在 .l 文件中创建标记定义。由于数据集数量庞大,它变得有点乏味。有没有办法读取文件中的所有单词,例如包含所有名词的 noun.txt 并给所有名词一个标记。 基本上,我想自动化这部分: %%
我是一名优秀的程序员,十分优秀!