共计 4792 个字符,预计需要花费 12 分钟才能阅读完成。
往期文章
Android 面试必备 – http 与 https 协定
Android 面试必备 – 计算机网络基本知识(TCP,UDP,Http,https)
Android 面试必备 – 线程
Android 面试必备 – JVM 及 类加载机制
Android 面试必备 – 零碎、App、Activity 启动过程
面试官系列 - 你真的理解 http 吗
面试官问,https 真的平安吗,能够抓包吗,如何避免抓包吗
前言
转眼间,2020 年已过来一大半了,2020 年很难,各企业裁员的音讯蛮多的,晋职,不发年终奖等等。2020 年的确是艰巨的一年。然而生存总是要持续,工夫不给你丧的机会!如果咱们能保持下来,一直进步本人,说不定会有新的机会。
面试中,网络(http,https,tcp,udp),jvm,类加载机制等这些根底的知识点是高频呈现的,每个程序员都能说上好多。但不肯定说到重点,以及了解背地的原理。
我在面试的过程中也常常被问到,于是总结记录了下来。千万不要小瞧这些根底,有时候,你算法,我的项目教训都过了,然而根底答得不太好。后果可能会通过,但这必定会影响你的评级,这是特地吃亏的。所以,不如花点工夫背一下,了解一下背地的原理。
举一个简略的例子,https 连贯过程是怎么的,应用了了哪种加密形式,能够抓包吗,怎么避免抓包,你是否可能对答如下。
废话不多说,开始进入注释。
背景
咱们晓得,http 通信存在以下问题:
- 通信应用明文可能会被窃听
- 不验证通信方的身份可能遭逢假装
- 无奈证实报文的完整型,可能已遭篡改
应用 https 能够解决数据安全问题,然而你真的了解 https 吗?
当面试官间断对你收回灵魂诘问的时候,你能对答如流吗
- 什么是 https,为什么须要 https
- https 的连贯过程
- https 的加密形式是怎么的,对称加密和非对称加密,为什么要这样设计?内容传输为什么要应用对称秘密
- https 是相对平安的吗
- https 能够抓包吗
如果你能对答自若,祝贺你,https 你曾经把握得差不多了,足够应酬面试了。
什么是 https
简略来说,https 是 http + ssl,对 http 通信内容进行加密,是 HTTP 的平安版,是应用 TLS/SSL 加密的 HTTP 协定
Https 的作用:
- 内容加密 建设一个信息安全通道,来保障数据传输的平安;
- 身份认证 确认网站的真实性
- 数据完整性 避免内容被第三方假冒或者篡改
什么是 SSL
SSL 由 Netscape 公司于 1994 年创立,它旨在通过 Web 创立平安的 Internet 通信。它是一种标准协议,用于加密浏览器和服务器之间的通信。它容许通过 Internet 平安轻松地传输账号密码、银行卡、手机号等私密信息。
SSL 证书就是恪守 SSL 协定,由受信赖的 CA 机构颁发的数字证书。
SSL/TLS 的工作原理:
须要了解 SSL/TLS 的工作原理,咱们须要把握加密算法。加密算法有两种:对称加密和非对称加密:
对称加密:通信单方应用雷同的密钥进行加密。特点是加密速度快,然而毛病是须要爱护好密钥,如果密钥泄露的话,那么加密就会被他人破解。常见的对称加密有 AES,DES 算法。
非对称加密 :它须要生成两个密钥:公钥(Public Key) 和私钥(Private Key)。
公钥顾名思义是公开的,任何人都能够取得,而私钥是私人保存的。置信大多程序员曾经对这种算法很相熟了:咱们提交代码到 github 的时候,就能够应用 SSH key:在本地生成私钥和公钥,私钥放在本地.ssh 目录中,公钥放在 github 网站上,这样每次提交代码,不必麻烦的输出用户名和明码了,github 会依据网站上存储的公钥来辨认咱们的身份。
公钥负责加密,私钥负责解密;或者,私钥负责加密,公钥负责解密。这种加密算法安全性更高,然而计算量相比对称加密大很多,加密和解密都很慢。常见的非对称算法有 RSA。
https 的连贯过程
https 的连贯过程大略分为两个阶段,证书验证阶段和数据传输阶段
证书验证阶段
大略分为三个步骤
- 浏览器发动申请
- 服务器接管到申请之后,会返回证书,包含公钥
- 浏览器接管到证书之后,会检验证书是否非法,不非法的话,会弹出告警提醒(怎么验证非法,下文会具体解析,这里先疏忽)
数据传输阶段
证书验证非法之后
- 浏览器会生成一个随机数,
- 应用公钥进行加密,发送给服务端
- 服务器收到浏览器发来的值,应用私钥进行解密
- 解析胜利之后,应用对称加密算法进行加密,传输给客户端
之后单方通信就应用第一步生成的随机数进行加密通信。
https 的加密形式是怎么的,对称加密和非对称加密,为什么要这样设计
从下面咱们能够晓得,https 加密是采纳对称加密和非对称秘密一起联合的。
在证书验证阶段,应用非对称加密。
在数据传输阶段,应用对称秘密。
这样设计有一个益处,能最大水平得兼顾平安效率。
在证书验证阶段,应用非对称加密,须要公钥和私钥,如果浏览器的公钥透露了,咱们还是可能确保随机数的平安,因为加密的数据只有用私钥能力解密。这样能最大水平确保随机数的平安。
在内容传输阶段,应用对称秘密,能够大大提高加解密的效率。
内容传输为什么要应用对称秘密
- 对称加密效率比拟高
- 一对公私钥只能实现单向的加解密。只有服务端保留了私钥。如果应用非对称秘密,相当于客户端必须有本人的私钥,这样设计的话,每个客户端都有本人的私钥,这很显著是不合理的,因为私钥是须要申请的。
https 是相对平安的吗
不是相对平安的,能够通过中间人攻打。
什么是中间人攻打
中间人攻打是指攻击者与通信的两端别离创立独立的分割,并替换其所收到的数据,使通信的两端认为他们正在通过一个私密的连贯与对方直接对话,但事实上整个会话都被攻击者齐全管制。
HTTPS 应用了 SSL 加密协议,是一种十分平安的机制,目前并没有办法间接对这个协定进行攻打,个别都是在建设 SSL 连贯时,拦挡客户端的申请,利用中间人获取到 CA 证书、非对称加密的公钥、对称加密的密钥;有了这些条件,就能够对申请和响应进行拦挡和篡改。
过程原理:
- 本地申请被劫持(如 DNS 劫持等),所有申请均发送到中间人的服务器
- 中间人服务器返回中间人本人的证书
- 客户端创立随机数,通过中间人证书的公钥对随机数加密后传送给中间人,而后凭随机数结构对称加密对传输内容进行加密传输
- 中间人因为领有客户端的随机数,能够通过对称加密算法进行内容解密
- 中间人以客户端的申请内容再向正规网站发动申请
- 因为中间人与服务器的通信过程是非法的,正规网站通过建设的平安通道返回加密后的数据
- 中间人凭借与正规网站建设的对称加密算法对内容进行解密
- 中间人通过与客户端建设的对称加密算法对正规内容返回的数据进行加密传输
- 客户端通过与中间人建设的对称加密算法对返回后果数据进行解密
因为短少对证书的验证,所以客户端尽管发动的是 HTTPS 申请,但客户端齐全不晓得本人的网络已被拦挡,传输内容被中间人全副窃取。
https 是如何避免中间人攻打的
在 https 中须要证书,证书的作用是为了避免 ” 中间人攻打 ” 的。如果有个中间人 M 拦挡客户端申请, 而后 M 向客户端提供本人的公钥,M 再向服务端申请公钥, 作为 ” 中介者 ” 这样客户端和服务端都不晓得, 信息曾经被拦挡获取了。这时候就须要证实服务端的公钥是正确的.
怎么证实呢?
就须要权威第三方机构来公正了. 这个第三方机构就是 CA. 也就是说 CA 是专门对公钥进行认证,进行担保的,也就是专门给公钥做担保的担保公司。寰球出名的 CA 也就 100 多个,这些 CA 都是寰球都认可的,比方 VeriSign、GlobalSign 等,国内出名的 CA 有 WoSign。
浏览器是如何确保 CA 证书的合法性?
一、证书蕴含什么信息?
颁发机构信息、公钥、公司信息、域名、有效期、指纹 ……
二、证书的合法性根据是什么?
首先,权威机构是要有认证的,不是轻易一个机构都有资格颁发证书,不然也不叫做权威机构。另外,证书的可信性基于信赖制,权威机构须要对其颁发的证书进行信用背书,只有是权威机构生成的证书,咱们就认为是非法的。所以权威机构会对申请者的信息进行审核,不同等级的权威机构对审核的要求也不一样,于是证书也分为收费的、便宜的和贵的。
三、浏览器如何验证证书的合法性?
浏览器发动 HTTPS 申请时,服务器会返回网站的 SSL 证书,浏览器须要对证书做以下验证:
- 验证域名、有效期等信息是否正确。证书上都有蕴含这些信息,比拟容易实现验证;
- 判断证书起源是否非法。每份签发证书都能够依据验证链查找到对应的根证书,操作系统、浏览器会在本地存储权威机构的根证书,利用本地根证书能够对对应机构签发证书实现起源验证;
- 判断证书是否被篡改。须要与 CA 服务器进行校验;
- 判断证书是否已撤消。通过 CRL(Certificate Revocation List 证书登记列表)和 OCSP(Online Certificate Status Protocol 在线证书状态协定)实现,其中 OCSP 可用于第 3 步中以缩小与 CA 服务器的交互,进步验证效率。
以上任意一步都满足的状况下浏览器才认为证书是非法的。
https 能够抓包吗
HTTPS 的数据是加密的,惯例下抓包工具代理申请后抓到的包内容是加密状态,无奈间接查看。
然而,咱们能够通过抓包工具来抓包。它的原理其实是模仿一个中间人。
通常 HTTPS 抓包工具的应用办法是会生成一个证书,用户须要手动把证书装置到客户端中,而后终端发动的所有申请通过该证书实现与抓包工具的交互,而后抓包工具再转发申请到服务器,最初把服务器返回的后果在控制台输入后再返回给终端,从而实现整个申请的闭环。
对于 httpps 抓包的原理能够看这一篇文章。
Android 平台 HTTPS 抓包解决方案及问题剖析
有人可能会问了,既然 HTTPS 不能防抓包,那 HTTPS 有什么意义?
HTTPS 能够避免用户在不知情的状况下通信链路被监听,对于被动授信的抓包操作是不提供防护的,因为这个场景用户是曾经对危险知情。要避免被抓包,须要采纳利用级的平安防护,例如采纳公有的对称加密,同时做好挪动端的防反编译加固,避免本地算法被破解。
扩大
如何避免抓包?
对于 HTTPS API 接口,如何避免抓包呢?既然问题出在证书信赖问题上,那么解决办法就是在咱们的 APP 中预置证书。在 TLS/SSL 握手时,用预置在本地的证书中的公钥校验服务器的数字签名,只有签名通过能力胜利握手。因为数字签名是应用私钥生成的,而私钥只把握在咱们手上,中间人无奈伪造一个无效的签名,因而攻打失败,无奈抓包。
同时,为了避免预置证书被替换,在证书存储上,能够将证书进行加密后进行「嵌入存储」,如嵌入在图片中或一段语音中。这波及到信息隐写的畛域,这个话题咱们有空了具体说。
对于 Android 中 Https 申请如何避免中间人攻打和 Charles 抓包,能够看一下这一篇文章。
Android 中 Https 申请如何避免中间人攻打和 Charles 抓包原理
预置证书 / 公钥更新问题
这样做尽管解决了抓包问题,然而也带来了另外一个问题:咱们购买的证书都是有有效期的,到期前须要对证书进行更新。次要有两种形式:
提供预置证书更新接口。在以后证书快过期时,APP 申请获取新的预置证书,这过渡时期,两个证书同时无效,直到平安实现证书切换。这种形式有肯定的保护老本,且不易测试。
在 APP 中只预埋公钥,这样只有私钥不变,即便证书更新也不必更新该公钥。然而,这样不太合乎周期性更新私钥的平安审计需要。一个折中的办法是,一次性预置多个公钥,只有任意一个公钥验证通过即可。思考到咱们的证书个别购买周期是 3 - 5 年,那么 3 个公钥,能够应用 9 -15 年,同时,咱们在此期间还能够公布新版本废除老公钥,增加新公钥,这样能够使公钥始终更新上来。
小结
结尾说到的几个问题,你能对答如流了吗
- 什么是 https,为什么须要 https
- https 的连贯过程
- https 的加密形式是怎么的,对称加密和非对称加密,为什么要这样设计?内容传输为什么要应用对称秘密
- https 是相对平安的吗
- https 能够抓包吗