HTTPS,你不知道的事儿

hyur9926 7年前
   <h3><strong>what is https?</strong></h3>    <p>HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 <a href="/misc/goto?guid=4959655083224123165" rel="nofollow,noindex">HTTP</a> 通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。</p>    <p>看到上面定义,我们大致也明白了HTTPS其实就是一个经过加密后的HTTP,具有更高的安全性。因此我们就需要了解一下经过加密的HTTPS是如何工作的?</p>    <h3><strong>加密算法</strong></h3>    <p>笔者目前所了解到的算法归为三类:</p>    <ul>     <li> <p>对称加密</p>      <ul>       <li>对称密码编码技术</li>       <li>编码和解码采用相同描述字符(加密、解密采用相同密钥)</li>       <li>对称加密使用简单</li>       <li>密钥较短</li>       <li>加密、解密过程较快、耗时短</li>       <li>常见算法有:DES、3DES、IDEA、AES、RC4等等</li>      </ul> </li>     <li> <p>非对称加密</p>      <ul>       <li>加密需要两个密钥:公钥(publickey)、私钥(privatekey)</li>       <li>公钥加密,私钥才能解密</li>       <li>保密性好</li>       <li>加密、解密过程较慢、耗时多</li>       <li>适合对少量数据加密</li>       <li>常见算法有:RSA、ECC、DSA等等</li>      </ul> </li>     <li> <p>Hash算法加密</p>      <ul>       <li>单向加密</li>       <li>通过Hash算法对数据加密生成唯一Hash值,此值无法计算出原来的数据</li>       <li>频繁应用于数据完整性检验</li>       <li>常用算法有:SHA、MD2、MD4、MD5等等</li>      </ul> </li>    </ul>    <h3><strong>how to work</strong></h3>    <p>在弄清HTTPS如何工作前,我需要了解两个概念:</p>    <h3><strong>密钥</strong></h3>    <ul>     <li>加密或解密都需要一个密钥,正如开门或锁门都需要一把钥匙</li>     <li>Java中密钥由KeyGenerator或KeyPairGenerator生成的</li>     <li> <p>对称密钥(KeyGenerator生成的)</p>      <ul>       <li>使用同一个密钥加密或加密</li>      </ul> </li>     <li> <p>非对称密钥(KeyPairGenerator生成的)</p>      <ul>       <li>公钥(pulickey)广泛用做传播,主要用做加密,私钥(privatekey)用做解密(公钥加密后的数据只有私钥才能解密)</li>      </ul> </li>    </ul>    <h3><strong>证书</strong></h3>    <ul>     <li>证书是一个许可证,用来证明这个证书的可信赖的</li>     <li>证书中可能内置密钥</li>     <li>android系统内置了很多证书,证书之间存在一定信任关系,信任是嵌套的,为了确保密钥的更高安全性</li>    </ul>    <p>了解上面两个概念后,我们接着来讲HTTPS如何通信?前面在定义HTTPS时讲到HTTPS是一种加密的HTTP,为了更高的安全性,没错,密钥和证书正是特定设计来实现HTTPS安全通信的。</p>    <p>说到安全通信,我们可能先想到对称加密算法,思路如下:</p>    <ul>     <li>将数据加密</li>     <li>将加密后的数据和密钥同时传给服务器</li>     <li>服务器利用传来的密钥解密数据</li>    </ul>    <p>以上这种方案存在很大漏洞,假如加密后的数据和密钥被黑客给截获,黑客拿着密钥直接把加密后的数据给解密了,这样数据就泄漏出去了。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/0d79d8b5011480f8a71cad0024b21d74.jpg"></p>    <p style="text-align: center;">1132780-f58fe3a5c5a7c281.jpg</p>    <p>既然对称算法不行,那就来试试非对称算法,思路如下:</p>    <ul>     <li> <p>服务器将公钥发给客户端</p> </li>     <li> <p>客户端将数据采用公钥加密然后发送给服务器</p> </li>     <li> <p>服务器收到客户端加密数据,用私钥解密数据</p> </li>    </ul>    <p>以上这个方案貌似不错,看过前面加密算法说明的童鞋应该清楚非对称算法有缺陷,就是加密、解密过程较慢、耗时多,影响用户体验。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/94412c4fff6157f3e79f5117ab67d953.jpg"></p>    <p style="text-align: center;">1132780-4e0c4064e76528b6.jpg</p>    <p>那有木有更好的方案呢?必须有啦,HTTPS最终采用的安全通信方案,大家看清楚啦</p>    <p> </p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/38634624748f7f9d77ea148977f15218.jpg"></p>    <p style="text-align: center;">1132780-2d7d1306d1b86b65.jpg</p>    <p>思路如下:</p>    <ul>     <li> <p>服务器生成一对非对称加密密钥:公钥(publickey)、私钥(privatekey)</p> </li>     <li> <p>服务器将公钥(publickey)发送给客户端</p> </li>     <li> <p>客户端生成对称加密密钥(clientkey),利用clientkey给数据加密</p> </li>     <li> <p>客户端使用服务器传来的公钥(publickey)给clientkey进行加密、此时clientkey是安全的,因为只有服务器才有私钥(private)能解密它</p> </li>     <li> <p>客户端发送用clientkey加密过的数据和用公钥(publickey)加密过的clientkey给服务器</p> </li>     <li> <p>服务器使用私钥(privatekey)解密用公钥(publickey)加密过的clientkey,得到真的clientkey</p> </li>     <li> <p>使用clientkey解密数据,这样数据就安全地从客户端传给服务器了。</p> </li>    </ul>    <h3><strong>总结</strong></h3>    <p>由于对称加密算法比非对称加密算法效率高、性能好,https决定采用对称加密算法来加密解密数据,使用非对称加密算法加密解密对称算法密钥,以确保通信安全。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/b2fabe1484086f7016dc0793c27c06c5.jpg"></p>    <p style="text-align: center;">1132780-253900d649118aa0.jpg</p>    <p> </p>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/756e100c1c2e</p>    <p> </p>