TLS
TLS 协议
来讲讲密码学的东西,我们现在进入那些http
开头的网页,我们的浏览器往往就会提示我们说,这个网页不安全。而现在安全的网页都至少是以https
开头的,这多出的一个s
就是TLS
协议的缩写。
TLS 协议(Transport Layer Security,传输层安全协议。它其实兼用了对称加密和非对称加密(你不是说非对称加密就是叼吗,但是它慢,所以调和一下,俩都得用)。
对称加密
对称加密就是加密和解密使用相同的密钥。我们有明文和密码表,发送方就通过这样的方式加密成密文进行传输,接收方收到密文后,通过相同的密码表,对密文进行解密来得到明文。
这样的问题就是安全性低,首先,密码表必须在两个方向上都通行,如果中间人截获了密文,他就无法解密,其次,密码表容易泄露,如果有人获取了密码表,他就可以解密所有传输过来的密文。最后,随着算力的增长,攻击者可以暴力破解密码表,使得通信不再安全。(比如二战中的图灵机,我们现在的量子计算机都通过领先加密方式的算力暴力破解密码)
非对称加密
非对称加密就是加密和解密使用不同的密钥。我们有公钥和私钥,公钥是公开的,私钥是保密的。发送方使用公钥加密明文,接收方使用私钥解密密文,这样就保证了通信的安全性。
非对称加密的优点是,公钥和私钥是不同的,公钥可以公开,私钥只有发送方自己知道,这样就保证了通信的安全性。但是,非对称加密的缺点也很明显,首先,公钥和私钥的生成和配对过程比较复杂,需要花费大量的计算资源,其次,公钥的传输和存储也比较麻烦,第三,非对称加密的通信速度慢,因为需要多次加密和解密。
总结来说,非对称加密主打的就是一手公钥和私钥的艺术,私钥只能自己知道,而只有对应私钥才能开锁。
RSA 加密
基于非对称加密的 RSA 加密算法,是目前最常用的公钥加密算法。RSA 加密算法的基本思路是,选择两个大素数 p 和 q,计算它们的乘积 n=pq,计算出一个质数 e,使得 e 和 (p-1)(q-1) 互质,然后计算出一个整数 d,使得 ed=1 mod (p-1)(q-1)。
这种正向加密很简单,但是数字一大,反向解密的难度就非常大,即使动用量子计算机,也得好久。
DH 加密
核心就是生成一个仅通信双方知晓的密钥。DH 加密算法的基本思路是,双方各自生成一个随机数,然后用自己的私钥加密,发送给对方,对方用自己的公钥解密,得到对方的随机数,然后再用双方的随机数生成一个密钥,用这个密钥进行通信。
这种加密方式的优点是,通信双方不需要共享任何密钥,双方的通信可以直接进行,速度快。缺点是,通信双方必须事先协商好,协商过程比较麻烦,而且通信双方必须知道对方的公钥,否则无法通信。
数字证书
数字证书是用来证明公钥的合法性的。首先,我们需要有一个权威的证书颁发机构(CA),它是公认的,可以认证公钥的合法性。CA 会给公钥颁发证书,证书里面包含公钥的一些信息,比如公钥的哈希值、公钥的使用者、公钥的有效期等。
当浏览器访问一个https
网页时,首先会向 CA 验证公钥的合法性,如果验证通过,浏览器就会生成一个随机的密钥,用公钥加密这个密钥,然后把密钥和证书一起发送给服务器。服务器收到密钥和证书后,会用私钥解密密钥,然后用密钥进行通信。这样就保证了通信的安全性。
总结来说,证书就是保存在源服务器当中,由权威机构发布的认证文件,里面包含公钥的一些信息,包括哈希值、使用者、有效期等。浏览器进行验证,成功后就可以信任进行访问,即公钥私钥的交换了。
TLS 握手
前置条件: 客户端已经验明了服务器的身份,也就是证书合法。
-
客户端发起请求,确定TLS版本,加密套件和第一随机数
-
服务器返回TLS版本,加密套件和第二随机数
-
客户端根据两个随机数生成一个预主密钥,并用服务器的公钥加密,发送给服务器
-
服务器用自己的私钥解密,得到预主密钥
-
这样两边都有了两个随机数和预主密钥,就可以生成一个相同的会话密钥
-
双方通过相同且唯一的会话密钥进行对称加密的通信,以提高通讯效率