Java面试突击为什么要用HTTPS及它的优点

目录
  • 前言
  • 1.HTTP
  • 2.HTTPS
    • 2.1 解决信任问题
    • 2.2 解决明文传输和完整性问题
    • 加密的分类
  • 总结

前言

说到 HTTPS 相信大部分人都是不陌生,因为目前我们使用的绝大数网站都是基于 HTTPS 的,比如以下这些: 

那么问题来了,他们为什么要使用 HTTPS 呢?HTTPS 有哪些过人之处呢?

1.HTTP

在说 HTTPS 之前,我们先要了解 HTTP,因为 HTTP 是 HTTPS 通讯的基础。 HTTP(HyperText Transport Protocol)超文本传输协议,它用于传输客户端和服务器端的数据。

 HTTP 使用很简单也很方便,但却存在以下 3 个致命问题:

  • 使用明文通讯,内容可以被窃听。
  • 不验证通讯方的真实身份,可能会遭到伪装。
  • 无法证明报文的完整性,很容易被篡改。

鉴于以上问题,所以现在的系统会使用 HTTPS 来替代 HTTP。

2.HTTPS

首先来说,HTTPS 并不是一种新的协议,而是在 HTTP 协议的基础上添加了加密机制 SSL(Secure Socket Layer)或 TLS(Transport Layer Security)。 HTTPS = HTTP + 加密 + 认证 + 完整性保护。

SSL 和 TLS:

SSL(Secure Socket Layer)最早是由浏览器开发厂商网景公司开发的,此公司开发了 SSL 3.0 及 3.0 之前的版本,之后便将 SSL 交给了 IETF(Internet Engineering Task Force)Internet 工程任务组的手中,IETF 以 SSL 3.0 为基础开发了 TLS 1.0,所以可以认为 TLS 是 SSL 的“新版本”。

2.1 解决信任问题

作为 HTTPS 来说,首先要解决的就是信任问题,也就是身份效验的问题,如果不解决信任问题就会存在服务器伪装,也就是“中间人攻击”的问题。 所谓的中间人攻击指的是,正常情况下本该是客户端和服务端直接进行交互的,但此处冲出来一个“坏人”(中间人),它包含在客户端和服务器端之间,用于盗取和篡改双方通讯的内容,

如下图所示: 

HTTPS 解决信任问题采用的是数字证书的解决方案,也就是服务器在创建之初,会先向一个大家都认可的第三方平台申请一个可靠的数字证书,然后在客户端访问(服务器端)时,服务器端会先给客户端一个数字证书,以证明自己是一个可靠的服务器端,而非“中间人”。 此时浏览器会负责效验和核对数字证书的有效性,如果数字证书有问题,那么客户端会立即停止通讯,如果没问题才会执行后续的流程,

如下图所示: 

有了数字证书之后,就可以验证服务器端的真实身份了,这样就解决了“中间人攻击”的问题,也解决了伪装的问题。

2.2 解决明文传输和完整性问题

虽然上面我们已经解决了信任问题,然而因为通讯双方是明文通讯的,所以在通讯时依然存在通讯内容被窃听的风险,此时应该怎么办呢? 于是我们想到,使用加密来解决信息暴露的问题。

加密的分类

加密主要分为两大类:对称加密和非对称加密。

  • 在对称加密中,有一个共享秘钥,通过这把共享秘钥可以实现信息的加密和信息的解密,它的特点是加密和解密的速度很快,但因为共享秘钥的问题,一旦共享秘钥被截获,那么所谓的加密和解码也就是一纸空谈了。
  • 在非对称加密中,有一对秘钥:公钥和私钥,使用公钥可以加密信息,但不能解密信息,使用私钥可以解密信息。它的特点是服务器端保存私钥,不对外暴露,只将公钥发送给客户端,而其他人即使拿到公钥,也解密不了加密的信息,所以此方式更安全,但非对称加密的执行速度比较慢。

那在 HTTPS 中要使用对称加密还是非对称加密呢? 使用对称加密,速度快,但不安全;使用非对称加密安全,但速度慢。 只有小孩做选择,成年人都要,所以 HTTPS 中既使用了非对称加密也使用了对称加密,它的整个交互流程是这样的: 

 HTTPS 执行流程如下:

  • 客户端使用 HTTPS 访问服务器端。
  • 服务器端返回数字证书,以及使用非对称加密,生成一个公钥给客户端(私钥服务器端自己保留)。
  • 客户端验证数字证书是否有效,如果无效,终止访问,如果有效:
    • 使用对称加密生成一个共享秘钥;
    • 使用对称加密的共享秘钥加密数据;
    • 使用非对称加密的公钥加密(对称加密生成的)共享秘钥。
    • 发送加密后的秘钥和数据给服务器端。
  • 服务器端使用私钥解密出客户端(使用对称加密生成的)共享秘钥,再使用共享秘钥解密出数据的具体内容。
  • 之后客户端和服务器端就使用共享秘钥加密的内容内容进行交互了。

这样,HTTPS 既保证了安全性,同时又保证了高效性,可谓鱼和熊掌兼得。

使用加密的方式也间接的保证了数据的完整性问题,如果是不完整的数据或有多余的数据,那么在解密时会报错,这样就能间接的保证数据的完整性了。

总结

使用 HTTP 协议存在明文通讯和中间人攻击等问题,但这些问题在 HTTPS 中得到了有效的解决,HTTPS 通过数字证书解决了中间人攻击的问题,使用加密手段解决了明文通讯和数据完整性的问题。

到此这篇关于Java面试突击为什么要用HTTPS及它的优点的文章就介绍到这了,更多相关Java HTTPS的使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java如何跳过https的ssl证书验证详解

    打开我们首页,明显看到链接是https打头,https和http的通信协议差别,在于https安全性更高: http和https的差别 很明显,二者最大的区别在于https多了一个ssl证书验证,可以说https是身披SSL外壳的http.因为http存在如下缺陷: 1)通信使用明文,内容可能被窃听(重要密码泄露) 2)不验证通信方身份,有可能遭遇伪装(跨站点请求伪造) 3)无法证明报文的完整性,有可能已遭篡改(运营商劫持) 而https是利用SSL/TLS建立全信道,加密数据包.HTTPS使用

  • Java中Https发送POST请求[亲测可用]

    1.直接建一个工具类放入即可 /** * 发送https请求共用体 */ public static JSONObject sendPost(String url,String parame,Map<String,Object> pmap) throws IOException, KeyManagementException, NoSuchAlgorithmException, NoSuchProviderException{ // 请求结果 JSONObject json = new JSO

  • java通过HttpServletRequest获取post请求中的body内容的方法

    在java web应用中,我们如何获取post请求body中的内容?以及需要注意的问题. 通常利用request获取参数可以直接通过req.getParameter(name)的方式获取url上面或者ajax data提交上来的参数.但是body是没有名字的,无法通过参数名字这种方式获取.这时候需要用到io流的方式来获取body中的内容. 这里先贴出一段代码: package com.lenovo.servlet; import java.io.BufferedReader; import ja

  • Java Servlet响应httpServletResponse过程详解

    目录 一.核心方法 1.setStatus 2.setHeader(Stringname,Stringvalue) 3.addHeader(Stringname,Stringvalue) 4.setContentType(Stringtype) 二.响应一个网页 三.返回一个文件 四.返回json数据 一.核心方法 1.setStatus 设置响应状态码 如果没有调用这个方法,默认返回200状态码(前提:正常执行,没有异常) 如果出现异常,返回500 前端代码: <body> <h3&g

  • Java 调用Restful API接口的几种方式(HTTPS)

    摘要:最近有一个需求,为客户提供一些Restful API 接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试Restful API接口,由于使用的是HTTPS,所以还要考虑到对于HTTPS的处理.由于我也是首次使用Java调用restful接口,所以还要研究一番,自然也是查阅了一些资料. 分析:这个问题与模块之间的调用不同,比如我有两个模块front end 和back end,front end提供前台展示,back

  • Java发送https请求代码实例

    1.前文:通过webService发送https请求,有两种版本,一种是携带证书验证(比较麻烦),另外一种就是直接忽略证书,本文提供的就是第二种(本人已测试过) 2.最简易代码: import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; import java.net.Ma

  • java开发https请求ssl不受信任问题解决方法

    本文主要讨论的是java开发https请求ssl不受信任的解决方法,具体分析及实现代码如下. 在java代码中请求https链接的时候,可能会报下面这个错误 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unab

  • Java如何实现通过证书访问Https请求

    目录 Java通过证书访问Https请求 创建证书管理器类 调用测试 工具类 https请求绕过证书检测 Java通过证书访问Https请求 创建证书管理器类 import java.io.FileInputStream; import java.security.KeyStore; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net

  • Java面试突击为什么要用HTTPS及它的优点

    目录 前言 1.HTTP 2.HTTPS 2.1 解决信任问题 2.2 解决明文传输和完整性问题 加密的分类 总结 前言 说到 HTTPS 相信大部分人都是不陌生,因为目前我们使用的绝大数网站都是基于 HTTPS 的,比如以下这些:  那么问题来了,他们为什么要使用 HTTPS 呢?HTTPS 有哪些过人之处呢? 1.HTTP 在说 HTTPS 之前,我们先要了解 HTTP,因为 HTTP 是 HTTPS 通讯的基础. HTTP(HyperText Transport Protocol)超文本传

  • java面试突击之sleep和wait有什么区别详析

    目录 前言 区别一:语法使用不同 区别二:所属类不同 区别三:唤醒方式不同 区别四:释放锁资源不同 sleep不释放锁 wait释放锁 区别五:线程进入状态不同 总结 前言 sleep 方法和 wait 方法都是用来将线程进入休眠状态的,并且 sleep 和 wait 方法都可以响应 interrupt 中断,也就是线程在休眠的过程中,如果收到中断信号,都可以进行响应,并抛出 InterruptedException 异常.那 sleep 和 wait 的区别都有哪些呢?接下来,我们一起来看.

  • Java面试突击之Bean作用域详解

    目录 1.作用域 2.作用域分类 2.1 singleton 2.2 prototype 2.3 request 2.4 session 2.5 application 3.作用域设置 总结 Spring 框架作为一个管理 Bean 的 IoC 容器,那么 Bean 自然是 Spring 中的重要资源了,那 Bean 的作用域是什么意思?又有几种类型呢?接下来我们一起来看. PS:Java 中的公共类可称之为 Bean 或 Java Bean. 1.作用域 Bean 的作用域是指 Bean 在

  • 面试突击之跨域问题的解决方案详解

    目录 1.跨域三种情况 2.跨域问题演示 2.1 前端网站 2.2 后端接口 3.解决跨域问题 3.1 通过注解跨域 3.2 通过配置文件跨域 3.3 通过 CorsFilter 跨域 3.4 通过 Response 跨域 3.5 通过 ResponseBodyAdvice 跨域 4.原理分析 演示项目源码 总结 跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题.跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据. 但这个保护机制也带来了新的问题

  • SpringBoot面试突击之过滤器和拦截器区别详解

    目录 实现过滤器和拦截器 a) 实现过滤器 b) 实现拦截器 过滤器 VS 拦截器 1.出身不同 2.触发时机不同 3.实现不同 4.支持的项目类型不同 5.使用的场景不同 总结 实现过滤器和拦截器 首先,我们先来看一下二者在 Spring Boot 项目中的具体实现,这对后续理解二者的区别有很大的帮助. a) 实现过滤器 过滤器可以使用 Servlet 3.0 提供的 @WebFilter 注解,配置过滤的 URL 规则,然后再实现 Filter 接口,重写接口中的 doFilter 方法,具

  • 吊打Java面试官!整理了一周的Spring面试大全(附答案)

    目录 Q1:什 么 是 spring? Q2:使 用 Spring 框 架 的 好 处 是 什 么 ? Q3:使 用 Spring 缺点是什么? Q4:IoC 是什么? Q5:IOC的优点是什么 Q6:IoC 容器初始化过程? Q7:依赖注⼊的实现方法有哪些? Q8:依赖注入的相关注解? Q9:依赖注入的过程? Q10:Bean 的生命周期? Q11:Bean 的作⽤范围? Q12:如何通过 XML ⽅式创建 Bean? Q13:Spring 有几种配置方式? Q14:如何用基于 XML 配置的

  • java面试散列表及树所对应容器类及HashMap冲突解决全面分析

    目录 性能分析 HashMap 产生冲突原因及解决方法 HashMap 解决冲突方法 jdk7 与 jdk8 中HashMap的区别 发生冲突 扩容 使用建议 散列表 Hashmap.hashtable.concurrentHashMap.hashset: 树: treemap.treeset.hashset treeset 继承自 treemap,hashset 继承自 hashmap : 性能分析 Map 是 Java 中的接口,Map.Entry 是 Map 的一个内部接口 Map 提供了

  • Java面试为何阿里强制要求不在foreach里执行删除操作

    小二听完就面露喜色,因为两年前,也就是 2021 年,他在<Java 程序员进阶之路>专栏上的第 63 篇看到过这题

  • JAVA利用HttpClient进行POST请求(HTTPS)实例

    最近,需要对客户的接口做一个包装,然后供自己公司别的系统调用,客户接口是用HTTP URL实现的,我想用HttpClient包进行请求,同时由于请求的URL是HTTPS的,为了避免需要证书,所以用一个类继承DefaultHttpClient类,忽略校验过程. 1.写一个SSLClient类,继承至HttpClient package com.pcmall.service.sale.miaomore.impl; import java.security.cert.CertificateExcept

  • java面试常见问题之Hibernate总结

    主要从以下十几个方面对Hibernate做总结,包括Hibernate的检索方式,Hibernate中对象的状态,Hibernate的3种检索策略是什么,分别适用于哪种场合,ORM解决的不匹配问题, Hibernate映射继承关系的3种方式,Session的find()方法以及Query接口的区别等方面问题的总结,具体内容如下: 1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象.) Ø  OID检索(按照对象的OID来检索对象.) Ø  HQL检索(使

随机推荐