`

搞懂https

 
阅读更多

最近应公司安全组的要求,所有系统对外请求方式由http方式改为https方式,因为https请求方式对数据进行了加密,http请求方式没有,显然https请求方式是安全的。但是https如何保证数据在网络传输的时候是安全的呢?项目中如何配置改造呢?我们需要了解一下加密算法和数字证书的概念。

###1.对称加密

服务器端生成密钥,然后把密钥发送给客户端,服务端给客户端发送数据时,使用密钥将数据加密传给客户端,客户端收到数据后使用密钥进行解密。如下图:



 

 

同理:客户端使用参数向服务端请求数据时,先用密钥将参数加密,然后传给服务器,服务器收到数据后用密钥将数据解密。

缺点:密钥在网络传输的过程中容易被第三者获取,第三者就可以使用密钥对数据进行加密解密,导致了数据泄露或者服务器被攻击。

常见的对称加密算法有:DES加密算法

 

###2.非对称加密

对称加密出现的问题是密钥在传输过程中容易被黑客获取。为了解决密钥安全传输的问题,我们使用非对称加密算法。在非对称加密中,服务端和客户端都有两把钥匙,一个是公钥(对所有人公开),一个是私钥(只有自己知道),使用公钥加密的数据只能使用对应的私钥进行解密,使用私钥加密的数据只能使用对应的公钥进行解密。这样,在数据传输的过程中,服务端使用客户端的公钥对数据进行加密,客户端收到数据后,使用私钥进行解密。同理,客户端想服务端请求数据也一样。如下图:



 

 

缺点:非对称加密效率比较低,比对称加密慢了上百倍。

优化:

我们可以使用对称加密和非对称加密结合的方式来优化,我们可以使用非对称加密的方式传输对称加密过程中需要的密钥,之后就可以使用对称加密的方式传输数据了,例如:服务器使用明文发送公钥给客户端,客户端收到公钥后先生成密钥(对称加密使用),然后使用收到的公钥对密钥加密传输给服务端,服务端使用该密钥解密,最终服务器端安全得到密钥,服务器端和客户端就可以使用对称加密进行加密了。

缺点:服务端在给客户端发送公钥的时候,黑客截取公钥,把自己的公钥冒充为服务器的公钥发给客户端。客户端收到公钥以后,无法确定是否是服务器发来的,这时候客户端就会用黑客的公钥进行加密生成密钥。然后在客户端把密钥传输给服务器的时候,黑客又拦截了密钥,最终成了客户端和黑客在通信。更有甚者,黑客再对这把密钥用刚才服务器的公钥进行加密,再发给服务器,这样服务器和客户端的通信完全暴露给了黑客。

 

常见的非对称加密算法有:RSA、椭圆曲线加密算法

 

###3.数字证书

非对称加密之所以不安全是因为,客户端不知道接收到的公钥是否是服务器的,因此我们需要证明客户端收到的公钥就是服务器的,即证明我是我。为了解决这个问题就需要引入数字证书:

我们需要一个证书认证机构CA(Certificate Authority),CA提供私钥,颁发证书。

数字证书的具体加密解密流程见下图(这个图是我从网上找的):



 

 

1.服务器将公钥和服务器信息使用hash算法生成摘要

2.为防止摘要被黑客窃取,服务器使用CA提供的私钥对摘要进行加密生成数字签名。

3.服务器将数字签名和公钥、服务器信息合并在一起生成数字证书。

4.客户端拿到数字证书,使用CA提供的公钥对数字证书里的数字签名进行解密得到数字摘要,并对数字证书里的公钥和服务器信息使用hash算法得到另一份数字摘要。

5.将两份摘要进行对比,如果一样,则证明消息是服务端发过来的。

这样就保证了数据传输的安全。

###4.SSL协议和TSL协议

HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,使用https协议必须从CA申请一个用于证明服务器用途类型的书。

 

SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。该协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

 

TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。

 

###5.java发送https请求

package com.buka.https;

import org.apache.http.HttpEntity;

import org.apache.http.NameValuePair;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.conn.ssl.NoopHostnameVerifier;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.conn.ssl.TrustStrategy;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.ssl.SSLContextBuilder;

import org.apache.http.util.EntityUtils;

 

import javax.net.ssl.SSLContext;

import java.io.IOException;

import java.security.KeyManagementException;

import java.security.KeyStoreException;

import java.security.NoSuchAlgorithmException;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

 * Created by  on 2018/10/30.

 */

public class HttpsUtils {

 

    private static CloseableHttpClient httpClient;

    private static CloseableHttpResponse httpResponse;

 

    public static CloseableHttpClient createSSLClientDefault() {

        try {

            SSLContext context = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy(){

                // 信任所有

                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                    return true;

                }

 

            }).build();

 

            SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(context, NoopHostnameVerifier.INSTANCE);

 

            return HttpClients.custom().setSSLSocketFactory(factory).build();

 

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        } catch (KeyManagementException e) {

            e.printStackTrace();

        } catch (KeyStoreException e) {

            e.printStackTrace();

        }

        return HttpClients.createDefault();

    }

 

 

    public static String sendhttpsMsg(Map<String, Object> params, String url) {

        try {

            HttpPost httpPost = new HttpPost(url);

            List<NameValuePair> list = new ArrayList<>();

 

            if (params != null) {

                for (String key : params.keySet()) {

                    list.add(new BasicNameValuePair(key, params.get(key).toString()));

                }

            }

            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");

 

            httpPost.setEntity(entity);

            httpClient = HttpsUtils.createSSLClientDefault();

            httpResponse = httpClient.execute(httpPost);

            HttpEntity httpEntity = httpResponse.getEntity();

            if (httpEntity != null) {

                String jsonStr = EntityUtils.toString(httpEntity, "UTF-8");

                return jsonStr;

            } else {

                return null;

            }

        } catch (Exception e) {

            e.printStackTrace();

            return null;

        } finally {

            try {

                httpResponse.close();

                httpClient.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

 

    }

 

    public static void main(String[] args) {

        Map<String, Object> map = new HashMap<>();

        map.put("sl_id_nbank_num_ai", "0");

        System.out.println(HttpsUtils.sendhttpsMsg(map, "https://localhost:9090/xxx/xxx"));

 

    }

}

 

 

 

 

 

  • 大小: 7 KB
  • 大小: 7.4 KB
  • 大小: 16.7 KB
分享到:
评论

相关推荐

    李宏毅—一天搞懂深度学习.rar

    李宏毅一天搞懂深度学习PPT+markdown语法的笔记,由于现在csdn下载无法自行设置积分,给出SlidesShare链接(有梯子的可以直接去下面链接处下载):...

    软件测试的技术学习路线图

    接口测试基础全知道、一文搞懂HTTPS协议、Cookie和Session知识扫盲、谁才是接口测试工具的"C位"?、快速掌握接口测试利器Postman、关于Jmeter的这些概念你必须知道、快速学习Jmeter之参数化、Jmeter接口测试之参数...

    彻底搞懂Dockerfile文件

    彻底搞懂Dockerfile文件 博文地址:https://maoqizhi.blog.csdn.net/article/details/126082479

    《搞懂Docker》系列配套示例程序

    《搞懂Docker》系列配套示例程序 https://blog.csdn.net/kebikeren/category_12666552.html

    一天学搞懂深度学习

    在“一天学搞懂深度学习”这个资源中,你将有机会深入理解这一领域的核心概念、模型和实践应用。 首先,让我们了解一下深度学习的基本构成。深度学习的核心是多层神经网络,这些网络由输入层、隐藏层和输出层组成。...

    study:个人学习记录和博客 (持续更新中)欢迎Star和Fork ^_^

    blog 这里记录了一些自己原创的博客和自己的学习过程,分享出来 由于本人水平一般,如果有哪里写错的地方和不对的地方,欢迎提出来,...3 - 10分钟彻底搞懂https 4 - koa2源码解读和实现 5 - 更优雅的node部署(cluster,

    一个小例子搞懂分页

    分页 博文链接:https://java-007.iteye.com/blog/196655

    30张图搞懂HTTP面试题

    本文将对 HTTP 协议的基本概念、Get 与 Post、HTTP 特性、HTTPS 与 HTTP、HTTP/1.1、HTTP/2、HTTP/3 演变等知识点进行详细解释。 HTTP 基本概念 ---------------- HTTP 是什么?HTTP 是超文本传输协议,也就是 ...

    一文搞懂子网掩码、网关和端口号

    端口号分为三个部分:0到1023的系统保留端口,通常用于标记特定服务,如HTTP服务通常使用80端口,HTTPS服务使用443端口;1024到49151的用户端口,一般用于应用程序之间的通信;以及49152到65535的动态或私有端口。每...

    90分钟搞懂分布式注册服务中心etcd2.png

    更多完整视频https://ke.qq.com/course/417774?flowToken=1013299

    QT5开发与实例代码 第13-14-15章代码 书里面自带的demo 感谢原作者

    此外,可能会讲解到使用QNetworkAccessManager进行HTTP/HTTPS请求,获取网页内容或者上传下载文件。 CH14、CH15、CH13分别代表了第14章、第15章和第13章的代码示例。通过这些示例,你可以实际操作并理解书中理论...

    https与服务器tomcat与android通信全程

    这是https与tomcat服务器,android通信的全部流程配置,以及需要的包源代码,我弄了3天才搞定的,网上资料很多,可是都是一个人弄一端,不好调试,所以一直搞不定,如果是一个人弄的话,就可以很快的搞定。如果不懂...

    html+php实现个人博客网站(超高分作业)毕业设计

    功能说明 未登录用户:仅可以浏览所有博客的内容。 已登录用户:1、浏览所有博客的内容;2、发表博客;...原文链接:https://blog.csdn.net/qq_44186838/article/details/118391048(附带超详细的运行说明)

    利用SVD(奇异值分解)求解线性方程组.zip

    在MVG(多视图几何)和机器学习领域,求解线性方程组几乎是所有算法的根本,本文旨在帮助读者搞懂矩阵分解与线性方程组的关系,并给出利用SVD求解线性方程组的实战代码。 本资源是博文"【动手学MVG】矩阵分解与线性...

    基于百度地图的轨迹追踪服务.rar

    期末考核的作业,网上搜了一下,是一个毕业设计的题目,搞不懂为什么做为期末考试,明明都没有教嘛,不过最后花了两天还是搞出来了,截图在这里:https://blog.csdn.net/qq_42733641/article/details/103731053 ...

    sm2国密算法工具完整版(QT),包含sm2,sm3和sm4

    SM2 (含SM3、SM4)国密算法工具QT版,彻底搞懂国密算法的使用。 文章链接:https://blog.csdn.net/yyz_1987/article/details/120501076 根据网友的反馈,之前的存在的闪退和乱码问题已解决,资源已更新。 若还遇到...

    Nginx详细讲解-对nginx进行讲解PDF

    一句话搞懂nginx如何使用以及工作逻辑对于程序员来说是必不可少的! 我们看看本文的大纲先了解一下本文都讲了哪些东西,大纲如下: 1. nginx 介绍 2.nginx目录一览 3.nginx.conf 文件解读 4. location 路由匹配规则 5....

    dubbo-monitor-simple-2.6.0-assembly.tar.gz

    我实在是搞不懂,就这官网一拉,maven一打包的东西为啥值十几个积分,程序员的开源精神哪儿去了?大伙儿可以直接去https://github.com/apache/dubbo/tree/dubbo-2.6.0 拉取压缩包,解压后找到dubbo-simple\dubbo-...

Global site tag (gtag.js) - Google Analytics