准备
在了解HTTPS协议之前,我们需要先来了解一下对称加密和非对称加密以及Hash算法。
关于对称,在生活中的理解大概就是两边是一样的。这其中有两个重点,一是有两边,二是它们是一样的。在这里,客户端和服务端充当两边,在两边的加密和解密的密钥是一样的,这就是对称加密的口头描述。
对称加密使用对称密码编码技术,也就是编码和解码采用相同描述字符,即加密和解密使用相同的密钥,实现这种加密技术的算法称为加密算法。对称加密使用简单,密钥较短,加密和解密过程较快,耗时短,常见的对称价目算法有DES,3DES,IDEA,AES,RC4等。
非对称加密与对称加密不同,其加密算法需要两个密钥:公开密钥(public key)和私有密钥(private key),两者是一对的。如果用公钥加密,只能用私钥解密。非对称加密保密性较好,但加密和解密花费的时间较长,不适合对大文件加密而只适合对少量的数据加密。常见的非对称加密算法有RSA,ECC,DSA(数字签名)等。
Hash算法是一种单向算法,通过Hash算法可以对目标数据生成一段特定长度、唯一的hash值,但是不能通过这个hash值重新计算出原始的数据,因此也称之谓摘要算法,经常被用在不需要数据还原的密码加密以及数据完整性校验上,常见的算法有MD2、MD4、MD5和SHA等。
加密(Cipher)
在java1.2时,引入了JCR(java 加密扩展)系统,用来负责java中的密钥和证书。
我们都知道,如果我们需要加密或解密一些信息,我们必须要有一个密钥。这就像你开门或者锁门的时候需要钥匙一样。
在java中,密钥由KeyGenerator或KeyPairGenerator生成。前者用来生成对称密钥,后来用来生成非对称密钥。
- 对称密钥:使用同一个密钥进行加密和解密
- 非对称密钥:使用不同的密钥进行加密和解密,通常被称为公钥(public key)和私钥(private key)。公钥可以用来广泛传播,但是私钥只有其所有者知道。在一个安全的非对称密钥加密方案中,当信息 用公钥加密后,只有用私钥才能解密。所以,即使一个黑客拿到你公钥加密过后的信息,也无法解密它,因为它没有配对的公钥。这样,传输的信息就是安全的。
证书(Certificate)
在现实中,如果你进入到钻石专卖店中想要买一颗钻石,你怎么知道钻石是真的?作为一个普通人来说,我们没有钻石方面的指数,但是如果这个钻石有个美国政府颁发的许可证,我们就会相信它是真的。
证书的作用也是如此。在计算机世界中,它可能包含了一些密钥,是另一个证书(姑且称之谓证书B好了)。这些密钥是我们需要的,而证书B是一个许可证,用来证明这些密钥是可信赖的。
做个简短的解释,每个钻石都有自己的“身份证书”,但是如何说明这个身份证书是合法的,而不是自己伪造的?因此,我们需要一个权威的机构来证明这个钻石的身份证书是合法的,如果这个钻石的身份是合法的,该权威机构就会为其办法一个“许可证”,这个许可证就相当于上面我们说到的证书B。可以看到,证书B的目的就是证明这个身份证书是这个钻石的身份证书,即证明某某东西是某某东西的东西。
问题:如何来证明证书B是可信赖的呢?
Android已经把将近150个CA根证书(数字证书认证机构认证过的证书)内置在我们的手机中。这150多个证书被全世界信赖,相当于是权威。
这150多个证书类似我们刚才说的证书B,分别用来证明某某东西是某某东西的东西
B证书中有另一个证书(假设为C证书),我们通过检查C是否存在于B中来确定C是否是可信任的,通过这个证书链,如果我们找到的最后一个证书(或根证书)和手机中的150个根证书中某个相同,我们就可以用这个证书(此处就是证书C)。
附:证书有多重格式
- x.509
x.509证书通常用于包含一个公钥 - PKCS12
PKCS12通常包含一个私钥。因此,PKCS12需要密码才能打开。
HTTPS
前面铺垫了那么多,现在重点终于来了。HTTPS(http over ssl)包含上面提到的加密和证书两部分,被设计用来在Internet安全进行通信。
如何安全的通信?
对称加密是我们最先想到的方案:将数据进行加密,然后将加密过的熟记和密钥同时传单服务器,服务器使用这个密钥解密加密过后的数据。

过程如上图所示:
- 生成key
- 使用生成的key加密数据
- 将加密后的数据和可以一起发送给服务器端
- 使用接受到的key解密数据
但是,这种方式会存在这样的安全问题:假设有黑客截取了该通信,这意味着黑客拥有了密钥和密文(加密后的数据)。一旦黑客有了密钥,解密密文就是很简单的事情了,我们所发送的数据就出现了泄露。
非对称加密的使用
上面的解决方案并不非常安全,我们继续往下看。使用非对称加密怎么样?
服务端发送给你公钥,你使用这个公钥加密数据。因为服务端是唯一拥有私钥的,这意味着只有服务能够解密密文,即使黑客截取了该通讯,但因为没有私钥也就无法解密密文。
但是使用非对称加密比堆成加密更加耗时。为了用户体验,不建议使用非对称加密这种方式加密/解密大量的数据。
最终的方案
前面的两种方案都无法满足我们对安全通信的要求,结合这两种方案,我们来看看最终的解决方案:

上述图片已经很完美的展现了HTTPS工作的流程了:
- 服务端生成一对非对称密钥:公钥和私钥,我们称之为“KeyPub”,“KeyPri”
- 服务端将公钥(KeyPub)发送到客户端
- 客户端生成一个堆成密钥(key2)
- 使用key2加密需要传递的数据,得到result1
- 使用KeyPub加密key2,得到result2
- 将result和result2传递给服务端
- 服务端使用KeyPri解密result2得到key2
- 服务端使用key2解密数result1,得到需要传递的数据。
通过上述方式,数据被很安全的传递到了服务器端,同时也保证了传递效率。
结论
https综合利用了非对称加密的安全性和堆成加密的效率,达到了一种近乎完美的数据传递功能。
网友评论