怎样做网站系统,南平公司做网站,无锡网站商城建设,下载一个网站的源码下载前言前段时间和同事讨论HTTPS的工作原理#xff0c;当时对这块知识原理掌握还是靠以前看了一些博客介绍#xff0c;深度不够#xff0c;正好我这位同事是密码学专业毕业的#xff0c;结合他密码学角度对tls加解密(DH这块)的阐述#xff0c;让我对这块原理有了更进一步的理… 前言前段时间和同事讨论HTTPS的工作原理当时对这块知识原理掌握还是靠以前看了一些博客介绍深度不够正好我这位同事是密码学专业毕业的结合他密码学角度对tls加解密(DH这块)的阐述让我对这块原理有了更进一步的理解正文开始…今天我们讨论2个话题TLS是如何保障数据传输安全的中间人攻击的原理和攻防什么是TLSTLSTransport Layer Security是新的标准旧的标准叫SSL(Secure Sockets Layer)。不管新旧标准他们的目的都是同一个那就是保护数据的安全那…究竟是怎样算保护呢?TLS是如何保障数据传输安全的先来说一般的情况没有SSL的时候客户端和服务器之间有一个传输通道是用来传输各种数据但这个通道是透明的也就是说其他人可以清楚的看到客户端和服务器到底在秘密的交换什么东西而有了SSL之后就是从原本的透明传输通道升级成了非透明的传输通道。这样其他人就不容易的看到到底在传输什么东西了这里不就说http和https的概念了简单来说就是http有了ssl就升级为https。
http 就是走的透明的通道
https 就是非透明的通道
没用https会经常被网络服务商植入广告没准你也遇到过访问某个网站时会被植入广告诱导点击。这就是有因为http是明文传输的长城宽带是知道你访问的网站服务器下发的明文自然就可以在明文中加点“东西”达到他不可告人的目的长城宽带还是比较收敛的只会在第一次访问植入广告后面再访问就不会植入了。
反正这种行为是绝对鄙视的
SSL是怎么起作用的既然明文传输是不行的那么把明文进行加密传输呗。就是客户端通过加密 传输到 服务端解密反之服务端加密 传输到 客户端解密在到数据加密传输这一步之前得首先建立安全连接通道SSL需要用到非对称加密的公私钥达到认证并建立连接通道。建立安全连接通道后在利用对称式加密对通道里所有的数据进行加解密。听起来有点绕没关系为了要了解整个概念必须先了解下对称式加密和非对称式加密对称式加密假如说有一个加密的算法是【把字母往后移位k位把位移后的结果以及k给对方】所以当A想要和B说HIA首先通过这个加密方法把HI这个词往后移2位就变成了JK当B收到位移数:2 以及JK。B就可以通过位移数2 往回推成HI这里的位移数2 就是这个对称式加密算法的秘钥A和B都拿到同样的秘钥2是一个对称的概念非对称式加密那就是A和B拿到的秘钥是不同的。(上面的例子A拿公钥B拿私钥)公钥和私钥一定是一组一对配对起来的。如果公钥是O 私钥是P 那么绝对OP是一组。B先把公钥给A B手上有私钥私钥(是绝对不能外泄的) 公钥是公开的A 通过 B给的公钥进行加密变成 xx B收到后用自己的私钥把xx进行解密变成HI如下图整个SSL的建立的步骤分为3个大项目 粉色标记的三个大块Authentication 使用非对称加密进行对服务器下发的证书认证Key Exchange (这里注意当采用Diffie—Hellman算法会和RSA算法的不同点)Encrypted Data Transfer 利用第二步的对称式加密对数据传输进行加解密想要更详细了解图中每一步请参阅那些關於ssl-tls的二三事-九注意在公开网络中比如浏览器访问的站点站点服务器不会要求客户端发送客户端证书所以上图的4和5是灰色展示下面说一下之前我误解的点1. RAS和DH都知道SSL用到了非对称加密包括网上文章网上文章这么说对于理解是有帮助的如果你只想了解大概没问题但是作为程序员我们需要更加深入理解。
上面文章说的其实是针对采用RSA算法的。因为DH算法中不需要所以不会在KeyExchange这一环节中利用非对称加密传输数据DH算法说白话一点就是在教你如何“安全的”告诉对方密码而不用担心密码被窃听。以下是擷取自wiki的DH流程簡圖:上图中Alice和Bob通过DH算法生成秘钥K其中g、p是2个非私密数据a、b是私密数据A是根据g、p、a算出来的非私密数据B是根据g、p、b算出来的非私密数据把A从a传到b根据求K公式b得到秘钥ka同理注p是一个大素数。p的位数决定了攻击者破解的难度。g则不需要很大并且在一般的实践中通常是2或者5。2. RSA对称加密算法中的秘钥(master secret)是不经过网络传输的Pre-master secret PMSClient’s random numberServer’s random numberPMS是通过网络传输的这里面用到了非对称加密3. 容易被忽略的重要点客户端验证服务端证书也用到了非对称加密一般我们会给域名申请证书最终的证书是最终用CA机构的Root根证书签发的。每一次签发的证书都是自己的私钥做了签名并放在证书里。由于CA机构也会用Root根证书签发一些中间证书再由中间证书签发的证书去签名生成你要申请的证书.如下图服务端下发也是下发一个证书链的结构浏览器拿到后去一步步验证。但光有证书链客户端是不能完成证书校验的必须有一张根证书才能迭代完成签名认证也就是说客户端必须信任根证书才能构建信任基础那么根证书在哪儿呢浏览器用的[可信任证书库]在 windows 平台中微软有专门的根证书库。在 Linux 平台中软件和服务一般使用 NSS 根证书库。在苹果平台中也有专门的根证书库。在windows操作系统中 打开cmd 输入 certmgr 就可以打开浏览器在收到server端发来的ssl证书信息拿到证书后验证其数字签名。具体就是根据证书上写的CA签发机构在浏览器内置的根证书里找到对应的公钥用此公钥解开数字签名得到摘要digest,证书内容的hash值据此验证证书的合法性。总之一句话CA就是神一样的存在如果你信任神你就应该信任这些CA。中间人攻击(MITM )中间人攻击就是中间卡了一个人帮你和服务器进行数据交换。这样就代表传输的所有数据都被这个中间人看光光。为什么我都用SSL了。不应该都是数据加密了嘛中间人是如何知道的用Fiddler来模拟下中间人攻击要完成中间人攻击需要配置Fiddler会在证书信任中心安装一个它的证书然后浏览器通过Fddler暴露的端口来访问目标站点首先看下正常的证书长啥样的 如下图中了中间人攻击的证书是长啥样的 如下图其实中间人的角色就是充当了服务器在和你建立SSL。所以对浏览器来说这个中间人就是真正的服务器只是浏览器不知情而已。但是其实浏览器并不会那么笨因为如上面我们讲了浏览器会去【可信任证书中心】去验证。如果遇到不存在的证书浏览器就会出现以下的提示客户端本身就是坏人的情况下才会在自己的【可信任证书中心】装一个用于中间人攻击的证书。有什么办法可以防止中间人攻击 -》 SSL Pinning什么是SSL PinningSSL Pinning 也叫 Certificate Pinning而前面有提到一個概念公钥私钥是一对一配对的。所以同一组公私钥出来的凭证這個凭证里面的公钥绝对是不会变的。而 SSL Pinning 就是要把 SSL 固定起来这个固定就是利用公钥的特性实现的。假设有一个APP是专门访问baidu.com的baidu.com证书里面的公钥是O的话而我app里面的代码已经有预先写好O这个公钥所以当我的app浏览 baidu.com的时候取得证书里面的公钥O拿这个公钥O和代码写的O对比是否一致。如果不一致就拒绝。为啥是中间人攻击的话那么这2个O肯定不一致验证一下就知道了下面这段脚本可以从服务端下发的证书拿到公钥分别测试下 正常情况和中间人攻击的情况正常情况#!/bin/bash
certsopenssl s_client -connect $1:443 -servername $1 -showcerts /dev/null 2/dev/null | sed -n /Certificate chain/,/Server certificate/p
rest$certs
while [[ $rest ~ -----BEGIN CERTIFICATE----- ]]
docert${rest%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----rest${rest#*-----END CERTIFICATE-----}echo echo $cert | grep s: | sed s/.*s:\(.*\)/\1/echo $cert | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der 2/dev/null | openssl dgst -sha256 -binary | openssl enc -base64
done
百度的CA证书是一个证书链如下图分别是
//颁发者是 GlobalSign Organization Validation CA
9ncsiOH9INfRO1dZosXOLZck/Z/ikYsRl0eiOUmiw//颁发者是 DigiCert Inc
BbkOPUFIMuqBj5SBjChDvpb1ZCdk3b9ZNDWOnKRB/bo
中间人攻击情况需要设置 -proxy 去模拟
#!/bin/bash
certsopenssl s_client -proxy 127.0.0.1:8888 -connect $1:443 -servername $1 -showcerts /dev/null 2/dev/null | sed -n /Certificate chain/,/Server certificate/p
rest$certs
while [[ $rest ~ -----BEGIN CERTIFICATE----- ]]
docert${rest%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----rest${rest#*-----END CERTIFICATE-----}echo echo $cert | grep s: | sed s/.*s:\(.*\)/\1/echo $cert | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der 2/dev/null | openssl dgst -sha256 -binary | openssl enc -base64
done
客户端如何用代码去实现SSL Pinning
CertificatePinner certPinner new CertificatePinner.Builder().add(baidu.com,sha256/9ncsiOH9INfRO1dZosXOLZck/Z/ikYsRl0eiOUmiw).build();OkHttpClient okHttpClient new OkHttpClient.Builder().certificatePinner(certPinner).build();
我是正东,学的越多不知道也越多。如果决定去深究一个东西, 一定要完全搞懂, 并认真总结一篇博客让以后能在短时间拾起来 ( 因为不搞懂你很难写一篇半年后还能理解的博客 )