我们为什么要用 HTTPS?(为什么不在使用http)

本文深入解析HTTPS协议,对比HTTP,强调HTTPS在数据加密、校验机制及身份认证方面的优势,有效解决网络通信中的窃听、篡改及冒充风险。

前言

    讲 HTTPS 之前,我们先来回顾一下 HTTP 协议。HTTP 是一种超文本传输协议,它是无状态的、简单快速的、基于 TCP 的可靠传输协议。(废话还用说么?)

既然 HTTP 协议这么好,那怎么有冒出来了一个 HTTPS 呢?主要是因为 HTTP 是明文传输的,这就造成了很大的安全隐患。在网络传输过程中,只要数据包被人劫持,那你就相当于赤身全裸的暴露在他人面前,毫无半点隐私可言。想象一下,如果你连了一个不可信的 WIFI,正好有使用了某个支付软件进行了支付操作,那么你的密码可能就到别人手里去了,后果可想而知。

网络环境的就是这样,给你带来便利的同时,也到处充满了挑战与风险。对于小白用户,你不能期望他有多高的网络安全意识,产品应该通过技术手段,让自己变得更安全,从源头来控制风险。这就诞生了 HTTPS 协议。(历史的趋势!)

 

HTTPS

简单理解,HTTP 不就是因为明文传输,所以造成了安全隐患。那让数据传输以加密的方式进行,不就消除了该隐患。

从网络的七层模型来看,原先的四层 TCP 到七层 HTTP 之间是明文传输,在这之间加一个负责数据加解密的传输层(SSL/TLS),保证在网络传输的过程中数据是加密的,而 HTTP 接收到的依然是明文数据,不会有任何影响。

SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。

优势

本节参考 阮一峰的SSL/TLS协议运行机制的概述。

在看实现细节之前,我们先看一下 HTTP 具体的安全隐患,以及 HTTPS 的解决方案。

HTTP 三大风险

  1. 窃听风险(eavesdropping):第三方可以获知通信内容。

  2. 篡改风险(tampering):第三方可以修改通信内容。

  3. 冒充风险(pretending):第三方可以冒充他人身份参与通信。

HTTPS 解决方案

  1. 所有信息都是加密传播,第三方无法窃听。

  2. 具有校验机制,一旦被篡改,通信双方会立刻发现。

  3. 配备身份证书,防止身份被冒充。

  4. 实现

  5. 通过上面的介绍,对 HTTPS 有了大致的了解。可本质问题还没说,HTTPS 是如何做到数据的加密传输?这儿不打算搬出复杂的算法公式,还是以最通俗的话述来讲讲我的理解。

    首先,先来了解下加密算法的方式,常用的有两种:对称加密与非对称加密。

  6. 对称加密:即通信双方通过相同的密钥进行信息的加解密。加解密速度快,但是安全性较差,如果其中一方泄露了密钥,那加密过程就会被人破解。

  7. 非对称加密:相比对称加密,它一般有公钥和私钥。公钥负责信息加密,私钥负责信息解密。两把密钥分别由发送双发各自保管,加解密过程需两把密钥共同完成。安全性更高,但同时计算量也比对称加密要大很多。

  8. 对于网络通信过程,在安全的前提下,还是需要保证响应速度。如何每次都进行非对称计算,通信过程势必会受影响。所以,人们希望的安全传输,最终肯定是以对称加密的方式进行。如图:

 

 

<think>我们有两个问题:1.静态方法为什么类?2.为什么this能在静态方法中使用?首先,第一个问题可能有些表述清,我推测应该是问“静态方法属于什么?”或者“静态方法为什么属于类?”。因此,我将按照“静态方法属于类,而是类的实例”来回答。第二个问题是解释为什么在静态方法中使用this关键字。下面按照要求进行回答:</think>### 回答:静态方法为什么属于类?为什么在静态方法中使用`this`? #### 1. 静态方法为什么属于类? 在Java中,静态方法(使用`static`关键字声明)属于类本身,而是类的实例对象。这是面向对象设计中的关键概念,其本质原因和特点如下: **根本原因**: - **类级作用域**:静态方法与类相关联,而非与特定对象实例关联 - **内存分配机制**:静态方法在类加载时(JVM的类初始化阶段)就分配内存 - **共享性**:所有实例共享同一个静态方法副本 **特性对比表**: | **特性** | 静态方法 | 实例方法 | |------------------|---------------------------------------------|-----------------------------------------| | 内存位置 | 类元空间(Method Area) | 堆内存(Heap)中的对象 | | 调用方式 | `ClassName.methodName()` | `objectReference.methodName()` | | 生命周期 | 从类加载到JVM关闭 | 对象创建到垃圾回收 | | 访问权限 | 只能访问静态成员 | 可访问静态成员和实例成员 | | 多态支持 | 支持方法覆盖(编译时绑定) | 支持方法覆盖(运行时多态) | **代码示例**: ```java class MathUtils { // 静态方法属于类 public static int add(int a, int b) { return a + b; } } public class StaticDemo { public static void main(String[] args) { // 无需创建实例即可调用 int sum = MathUtils.add(5, 3); // 正确:通过类名调用 System.out.println("Sum: " + sum); // 通过实例调用(推荐但合法) MathUtils utils = new MathUtils(); int sum2 = utils.add(10, 20); // 编译器会警告但可运行 } } ``` #### 2. 为什么在静态方法中使用`this`? `this`关键字在静态方法中被禁止使用,这是由Java语言规范明确规定的。核心原因如下: **根本原因**: - **语义冲突**:`this`指向当前对象实例,但静态方法没有关联的实例 - **生命周期匹配**:静态方法在类加载时就存在,此时可能还没有任何对象实例 - **访问权限限制**:静态方法能访问实例成员(需要对象实例) **详细解释**: 1. **无实例上下文**: ```java class Example { int value = 10; static void staticMethod() { // this.value = 20; // 错误!this存在 } } ``` 静态方法调用时,JVM会传递隐式的`this`参数(非静态方法会传递`this`作为第0个参数) 2. **对象状态可知**: ```java public class Counter { private int count = 0; public static void increment() { // this.count++; // 错误!哪个对象的count? } } ``` 如果有100个Counter实例,静态方法无法知道要修改哪个实例的count 3. **初始化顺序问题**: ```java class InitTest { static { // this.doSomething(); // 错误!静态块执行时对象尚未创建 } } ``` 静态方法(包括静态初始化块)执行时,类可能还未完全初始化,对象实例更存在 **解决方案**: - 需要访问实例状态时,使用非静态方法 - 需要跨实例共享数据时,使用静态变量 - 通过参数传递对象引用: ```java class Processor { public static void process(Processor obj) { obj.instanceMethod(); // 通过参数传递实例 } private void instanceMethod() { /*...*/ } } ``` #### 关键设计原则 Java这样设计是为了保证: 1. **类型安全**:避免在无对象上下文时访问实例成员 2. **内存效率**:静态方法依赖对象实例,减少内存开销 3. **线程安全基础**:静态方法天然适合无状态操作(但需注意同步问题) 4. **工具类模式**:如`Math`、`Collections`等工具类完全使用静态方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值