Https安全通信

作者: Poseidon_Wang | 来源:发表于2017-02-14 17:52 被阅读92次

最近在搭建Android框架,将网络分了些模块,本身因为使用OkHttp+Retrofit+RxJava的模式,具体实现不讲了,网上有很多文章
HttpManager
|-基础请求
|-日志模块
|-缓存模块
|-安全模块(Https)
总体结构采用了组合大于继承的模式,日志以及缓存模块都是依赖Interceptor完成的,如有遗漏的希望读者指正,本文的重点在于安全模块,本来还有验证不过现在用的少就不加了

Https

关于https网上有恨多文章,对加密接触不多刚开始看不懂私钥,密钥的验证过程,那么首先来讲讲私钥密钥的概念私钥,密钥详细解释
加密:公钥加密,私钥解密
认证:私钥加密,公钥解密
前方高能,粘贴一个场景,便于理解
首先A有自己的公钥和私钥:A_public_key, A_private_key
B也有自己的公钥和私钥: B_public_key, B_private_key
(1)A和B互换公钥
(2)A将文件用hash算法生成摘要,用A_private_key对摘要加密,得到的就叫数字签名
(3)A用B_public_key对文件加密
(4)将加密的文件和数字签名一起发给B
------B收到内容后
(5)用B_private_key解密文件,得到明文
(6)用A_public_key解密数字签名,得到内容摘要
(7)将明文的文件内容用同样hash算法得到摘要,与第六步的摘要对比。相同则证明内容和来源都正确。
然后我们来具体了解https
http相对于https多了一个s这个s就是ssl(Secure Socket Layer),夹在tcp/ip跟http层之间,接下来看看流程

https网络请求流程
  • 浏览器将自己支持的一套加密算法、HASH算法发送给网站。
  • 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
    浏览器获得网站证书之后,开始验证证书的合法性,如果证书信任,则生成一串随机数字作为通讯过程中对称加密的秘钥。然后取出证书中的公钥,将这串数字以及HASH的结果进行加密,然后发给网站。
  • 网站接收浏览器发来的数据之后,通过私钥进行解密,然后HASH校验,如果一致,则使用浏览器发来的数字串使加密一段握手消息发给浏览器。
  • 浏览器解密,并HASH校验,没有问题,则握手结束。接下来的传输过程将由之前浏览器生成的随机密码并利用对称加密算法进行加密。

做完了文字说明,接下来就是在OkHttp上实现Https了

    public static SSLSocketFactory getSSLSocketFactory() {
        try {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            int index = 0;
            InputStream certificate = new ByteArrayInputStream(CER_12306.getBytes());
            String certificateAlias = Integer.toString(index++);
            keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
            if (certificate != null)
                certificate.close();

            SSLContext sslContext = SSLContext.getInstance("TLS");

            TrustManagerFactory trustManagerFactory =
                    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

            trustManagerFactory.init(keyStore);
            sslContext.init
                    (
                            null,
                            trustManagerFactory.getTrustManagers(),
                            new SecureRandom()
                    );
            return sslContext.getSocketFactory();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

以上的证书我复制出来了字符串CER_12306
大概流程就是先生成证书放入KeyStore,然后用KeyStore去初始化TrustManager,再用TrustManager获得SSLContext

相关文章

  • Https安全通信

    最近在搭建Android框架,将网络分了些模块,本身因为使用OkHttp+Retrofit+RxJava的模式,具...

  • Https安全通信(一)

    iOS 9.0之后苹果开始要求使用Https进行通信。ATS是iOS9和OS X El Capitan的一个新特性...

  • HTTPS 安全通信原理

    随着人们网络安全意识的提高,人们对信息的安全传输越来越重视。各大公司也逐步将网站升级成 HTTPS。那么,相较于H...

  • etcd入门之安全配置

    1 基于TLS的通信安全配置 etcd通过简单的配置就能支持基于https的安全通信。https通信需要准备相应的...

  • 图解https证书强校验的必要性

    1、正常https通信 2、面对1中的通信存在的安全隐患 3、针对上述https通信的安全隐患的解决方案

  • 浅谈HTTPS之安全通信

    本文系网上摘抄整理,帮助自己和大家学习! 加密算法简介 正文开始之前,我先来解释简单的解释下对称加密和非对称加密....

  • https安全通信的原理

    http协议明文传输:三次握手之后,直接交互。互相发送的数据都是完全明文传输。一旦在客户端到服务端的中间过程中,被...

  • GoWeb

    HTTPS通信原理 HTTPS(Secure Hypertext Transfer Protocol)安全超⽂本传...

  • SSL/TLS协议运行机制

    近年来物联网通信安全越来越重要,大家都纷纷使用https进行网络通信,而https是https+ssl的通信协议。...

  • HTTPS通信机制详解

    https是当前网络通信中保证传输消息安全的一种最为常用的协议,本文将阐述https的通信机制,道出其到底安全在哪...

网友评论

  • MiBoy:有一点没说出来,就是非对称加密比对称加密慢,然后都是怎么解决这个问题的?楼主能说一下吗
    MiBoy:@Poseidon_Wang 好,我会关注的
    Poseidon_Wang:@MiBoy 微信关注下infoQ(非推广,哈哈哈) 今天推送的文章里有详细对加密的性能测试以及优化的分析,非常详细,主要瓶颈在于非对称加密ras耗时太长
  • 追逐丶:学习了😃主要是文字,不问代码🐸

本文标题:Https安全通信

本文链接:https://www.haomeiwen.com/subject/ajaxwttx.html