前言–阅读本文你将收获

1.https加密的基本原理与过程,https为什么是安全的?
2.什么是中间人攻击,中间人攻击的基本原理
3.如何防止中间人攻击

作者:RicardoMJiang
链接:https://juejin.im/post/6880024440143347719

https加密的基本原理

https要完成的目的

1.Client必须要能确定,它要访问的Server确实是正确的Server

2.Client和Server交流的信息不能被其它第三方窃听

3.当然,针对第1点,反过来,Server也可以要求,必须确认Client是它想通信的正确的Client,不过道理和1一样,这里不展开

通过HTTPS握手建立加密信道来保证上述要求

https三次握手

三次握手过程如下:

看了上述三次握手过程,可以知道,handshake主要完成的事情:

1.客户端&服务端通信,协商加密方式

2.客户端(Client)和服务端(Server)互相确认身份

3.双方安全地交换https通信使用的密钥(Session Key)

第一阶段:C&S协商加密方式

客户端向服务端发送ClientHello信息,信息主要包括客户端支持的加密方式、客户端支持的SSL版本等;服务端接收到ClientHello信息后,向客户端发送一个ServerHello信息,主要是告诉客户端它将使用什么加密方式和SSL版本。

第二阶段:身份校验

阶段2主要是,客户端&服务端互相校验对方身份

客户端与服务端之间验证身份是通过证书完成的

1.关于证书:

服务端向客户端下发自己的证书,通常是CA认证的证书。证书包括了很多信息,主要有“公钥信息”、“签名”、“组织机构地区等信息”、“证书颁发机构”,关联的中级证书(medium certificate)、根证书(root certificate)等。

X.509 应该是比较流行的 SSL 数字证书标准,包含(但不限于)以下的字段:

字段 值说明
对象名称(Subject Name) 用于识别该数字证书的信息
共有名称(Common Name) 对于客户证书,通常是相应的域名
证书颁发者(Issuer Name) 发布并签署该证书的实体的信息
签名算法(Signature Algorithm) 签名所使用的算法
序列号(Serial Number) 数字证书机构(Certificate Authority, CA)给证书的唯一整数,一个数字证书一个序列号
生效期(Not Valid Before) (`・ω・´)
失效期(Not Valid After) (╯°口°)╯(┴—┴
公钥(Public Key) 可公开的密钥
签名(Signature) 通过签名算法计算证书内容后得到的数据,用于验证证书是否被篡改

主要就是签名,用于验证是否篡改过

2.客户端如何通过证书确定服务端的身份?

证明下面两点,(然后才可以使用证书上的公钥来加密生成Session key的随机数)

  1. 证明baidu.com这个证书确实是百度的
  2. 证明baidu.com这个证书没有被其他人攥改过

证书以证书链的形式组织,在颁发证书的时候首先要有根CA机构颁发的根证书,再由根CA机构颁发一个中级CA机构的证书,最后由中级CA机构颁发具体的SSL证书。

数字证书采用信任链验证。数字证书的信任锚(信任的起点)就是根证书颁发机构。根证书(root certificate)是一个无签名或自签名的证书。是用于识别根证书颁发机构(CA)的公钥证书。

验证的具体实现如下图所示:

  1. 从左往右,用户证书指向签署它的中级证书,并且,用户证书的摘要经由中级证书的私钥加密,密文作为该用户的证书签名(signature)记录在用户证书上。
  2. 中级证书相应的,指向签署它的根证书,同时,中级证书的摘要经由根证书的私钥加密,密文作为中级证书的签名记录在中级证书上
  3. 根证书在签署的时候,使用签发机构的私钥对证书的摘要进行加密,密文作为根证书的签名记录在根证书上。

如何验证证书

1.如何验证证书没有被篡改过

比如验证用户证书A,需要用到中级证书的公钥B解密前者的签名得到摘要 Digest1,我们的客户端也计算A证书的内容得到摘要 Digest2。对比这两个摘要就能知道前者是否被篡改。后者同理,使用他的证书签发者提供的公钥验证。当验证到到受信任的根证书时,就能确定这个证书是可信的。

2.为什么根证书是可信的

数字证书认证机构(Certificate Authority, CA)签署和管理的 CA 根证书,会被纳入到你的浏览器和操作系统的可信证书列表中,并由这个列表判断根证书是否可信。所以不要随便导入奇奇怪怪的根证书到你的操作系统中。

第三阶段:产生通信密钥

前面讲过,第1阶段,服务端告知了客户端后面要使用的加密方式(普遍都是对称加密,因为非对称加密成本太高,速度低下)。

第2阶段,客户端验证服务端证书是正确的,即,证书上标明的公钥拿来加密信息,加密后的信息,只有该服务端能解密,其它第三方无法解密。 那么在第三阶段,客户端产生了第三个随机数,这个随机数称为PMSc(a premaster secret,46 bytes ),使用服务端的公钥对PMSc加密,然后上送给服务端。服务端取到这个密文后,用自己的私钥解密,得到PMSc。

好了,接下来最重要的一步来了:根据之前协商好的加密方式,以及3个随机数,客户端、服务端各自产生出通信密钥,该密钥称为Master Secret,简称MS,也称Session Key。这个密钥虽然是各自产生的,但是产生后是一致的。

第四阶段:加密信道已经建立

客户端,服务端各自产生了通信密钥后,就用这个相同的MS对往后的所有通信信息进行加密。而这个密钥,第三方是不知道的,第三方尽管去窥探,但是他们看不懂信息,所以效果相当于,客户端&服务端在一个加密信道中通信。

从上面可以看出,https通信过程是对称与非对称加密混合的

中间人攻击与https抓包

一个针对SSL的中间人攻击过程如下:

中间人其实是做了一个偷梁换柱的动作,核心是如何欺骗客户端,从而让客户端能够放心的与中间人进行数据交互而没有任何察觉。我们来看Charles如何做到HTTPS抓包的,网上有很多fiddlers如何抓HTTPS包的教程,几步就搞定了,其中最核心的就是:

将私有CA签发的数字证书安装到手机中并且作为受信任证书保存

当私有的CA证书添加到系统信任证书后,就可以完成证书链验证过程

fiddler抓包过程,详情可见:www.cnblogs.com/afeng2010/p…

android7.0之后用户CA限制

Android从7.0开始系统不再信任用户CA证书(应用targetSdkVersion >= 24时生效,如果targetSdkVersion < 24即使系统是7.0+依然会信任)。也就是说即使安装了用户CA证书,在Android 7.0+的机器上,targetSdkVersion >= 24的应用的HTTPS包就抓不到了。

Android 6.0(API 23)及更低版本应用的默认网络安全性配置如下:

<!-- 默认允许所有明文通信 -->
<base-config cleartextTrafficPermitted="true"><trust-anchors><!-- 信任系统预装 CA 证书 --><certificates src="system" /><!-- 信任用户添加的 CA 证书,Charles 和 Fiddler 抓包工具安装的证书属于此类 --><certificates src="user" /></trust-anchors>
</base-config>

而在 Android 7.0(API 24)到 Android 8.1(API 27)的默认网络安全性配置如下:

<!-- 默认允许所有明文通信 -->
<base-config cleartextTrafficPermitted="true"><trust-anchors><!-- 信任系统预装 CA 证书 --><certificates src="system" /></trust-anchors>
</base-config>

而在 Android 9.0(API 28)及更高版本的默认网络安全性配置如下:

<!-- 默认禁止所有明文通信 -->
<base-config cleartextTrafficPermitted="false"><trust-anchors><!-- 信任系统预装 CA 证书 --><certificates src="system" /></trust-anchors>
</base-config>

如果我们要抓自已APP的包,解决方式就是使用 Android 6.0 以下的网络安全性配置: 添加res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config><base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" /><certificates src="user" /></trust-anchors></base-config>
</network-security-config>

然后在清单文件中指向该文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... ><application android:networkSecurityConfig="@xml/network_security_config"... >...</application>
</manifest>

如何防止中间人攻击

通过上面的讲解,大家可以知道

假设你的设备没有安装信任过来历不明的证书,那么不管在任何WIFI或者网络环境下,通常HTTPS通信都是安全的

并且在android7.0及以上,就算手机安装信任了证书,在一般情况下也是安全的,因为android7.0以上默认不信任用户证书

所以通常情况下,我们不需要做什么特别操作来防止中间人攻击

不过有部分金融类的APP需要额外校验来保证https的安全性

我们可以下载服务器端公钥证书,然后将公钥证书编译到Android应用中一般在assets文件夹保存,由应用在交互过程中去验证证书的合法性。

    //使用内置证书public static SSLSocketFactory getSSLSocketFactory_Certificate(Context context) {try {//获取X.509格式的内置证书CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(null);Collection<? extends Certificate> cers = certificateFactory.generateCertificates(context.getAssets().open("CACertificate.cer"));int index = 0;for (Certificate certificate : cers) {String certificateAlias = Integer.toString(index++);keyStore.setCertificateEntry(certificateAlias, certificate);}//用这个KeyStore去引导生成的TrustManager来提供验证final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());trustManagerFactory.init(keyStore);//用TrustManager生成SSLContextSSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());//SSLContext返回SSLSocketFactoryreturn sslContext.getSocketFactory();} catch (Exception e) {throw new RuntimeException(e);}}

总结

本文主要介绍了https的基本流程与原理,并介绍了中间人攻击的原理与预防,希望对大家有所帮助。

关于HTTPS更多面试点,也可以看看这篇文章字节一面:https 真的安全吗?可以抓包吗?如何防止抓包?

文末

一个月前答应大伙的备战金九银十,大厂面试真题来啦!

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
给文章留个小赞,就可以免费领取啦~

戳我领取:Android对线暴打面试指南、超硬核Android面试知识笔记、3000页Android开发者架构师核心知识笔记

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2020面试真题解析

资料已经上传在我的GitHub,或者关注后私信我【666】即可领取(无偿)。

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

Android程序员面试必须要掌握的:Https加密原理、中间人攻击到底是怎么回事相关推荐

  1. 请画图说明tcp/ip协议栈_5年Android程序员面试字节跳动两轮后被完虐,请查收给你的面试指南 - Android木子李老师...

    大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了- 所以 ...

  2. 直接上干货!5年经验Android程序员面试27天,大厂直通车!

    前言 我最近在筹备Android面试的相关文章,我发现,Framework是一个十分重要的点,被不少大厂所看重. 如图,这是我们的一个技术交流群里面的对话↓↓↓ 前阵子我写的Android技术文里面, ...

  3. 阿里P8亲自讲解!5年经验Android程序员面试27天,附答案

    前言 2020年,互联网裁员潮下,我度过了人生中最清晰的半年. 今年我本命年,熬过了程序员35的坎,却在36岁被公司破产来了当头一棒,领完了当月份的工资,老板,也是我哥们的老李走进我的办公室,没有迂回 ...

  4. Android程序员面试必备的知识点,完整PDF

    笼统来说,中年程序员容易被淘汰的原因其实不外乎三点. 1.输出能力已到顶点.这个人奋斗十来年了,依旧碌碌无为,很明显这人的天花板就这样了,说白了,天赋就这样. 2.适应能力越来越差.年纪大,有家庭,老 ...

  5. 5年经验Android程序员面试27天,大厂直通车!

    前言 我最近在筹备Android面试的相关文章,我发现,Framework是一个十分重要的点,被不少大厂所看重. 如图,这是我们的一个技术交流群里面的对话↓↓↓ 前阵子我写的Android技术文里面, ...

  6. Android程序员面试必备的知识点,附答案

    前言 我今年38岁,失业前是南方二线城市某知名互联网公司的部门技术主管,婚姻幸福,膝下有一儿一女,组成一个好字,房子车子:有一辆十几万的汽车,一套月供八千的房子,妻子全职在家带娃,家里的一切开销全部指 ...

  7. Android程序员面试必备的知识点,androidauto地图

    AsyncTask是什么? AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI. AsyncTask是一个抽象的泛型类 ...

  8. 膜拜大佬!5年经验Android程序员面试27天,高级面试题+解析

    前言 网上关于启动优化的文章多不胜数,内容千篇一律,大都是列举一些耗时操作,采用异步加载.懒加载等. 而在面试过程中,关于启动优化的问题,如果只是很表面地回答耗时操作应该放在子线程,显然太过于普通,无 ...

  9. Android程序员面试必备的知识点,Android程序员

    AsyncTask是一个抽象的泛型类,它提供了Params.Progress和Result这三个泛型参数,其中Params表示参数的类型,Progress表示后台任务的执行进度和类型,而Result则 ...

最新文章

  1. consul安装配置使用
  2. 多媒体计算机技术论文结束语,论述多媒体计算机技术在广播电视工程中的应用成果论文...
  3. php代码上线,实现版本切换
  4. mysql常驻内存_MySQL的内存和相关问题排查
  5. [MySQL高级](一) EXPLAIN用法和结果分析
  6. 什么是面向服务的体系结构(SOA)?(转载)
  7. java自行车s码适合身高_公路自行车尺寸与身高的选择
  8. 手把手实现AI诗歌生成(AI写诗)
  9. 如何将页脚(footer)保持在页面底部
  10. 亚马逊云科技平台上的无服务器 WebSocket
  11. 【群体遗传】Fst(群体间分化指数)
  12. 第二章 随机变量及其分布
  13. Android使用和风天气接口获取天气数据在APP中展示天气
  14. 分享一些Linux下监控软件
  15. video标签的全部配置
  16. Git版本控制+ SourceTree+AndroidStudio 忽略文件
  17. Excel中双击格式刷的妙用
  18. 如何快速提升广发样样行额度
  19. 商业经济杂志商业经济杂志社商业经济编辑部2023年第2期目录
  20. 校园综合能效管理平台建设的意义-Susie 周

热门文章

  1. 国考计算机专业知识大纲,2021国考专业科目考试大纲(计算机类)考什么内容?...
  2. 利用C#脚本来处理Excel
  3. 微金所张继业:规范化运作 回馈投资人
  4. 拆书笔记27|孔夫子和机器人
  5. 在python中如何读取批量图片_Python批量处理图片
  6. 淘宝API 淘宝链接获取解析获取商品id
  7. Flink实战(九十三):数据倾斜(二)keyby 窗口数据倾斜的优化
  8. 自动化篇 - 为闲鱼制作一个客服机器人
  9. Flex常用布局,了解一下
  10. 换服务器要重新百度站长验证站点吗6,百度站长工具教程一:如何使用百度站长平台验证网站 – 陆琳玲SEO博客...