各位老师好,我现在是一名桂电大一新生,25高考的,就读于密码学专业,前段时间研究SIS构造测的时候,入门了单向函数和陷门生成算法,以此牵扯出了CA证书和数字签名等等内容,因为这块内容比较系统,我自己就借助了经典的https加密进行学习,在此想要分享一下自己的学习经历。

       首先,如果是大部分入门密码学的人,看到诸如对称,非对称加密,密钥管理与分发,数字签名,CA证书,密码协议等等很多概念肯定都会一头雾水,因为密码学是一个高度体系化的领域,往往是好不容易弄清了一个概念,却发现到了实际情况还要去学其他很多概念,并且还非得弄清楚不同概念之间的联系(别问我为什么知道,因为自己其实已经被这个问题困扰很久了,直到最近才勉强理清一点点),所以此次想要借助https辅助一下,看看能不能稍微融会贯通一点,OK话不多说接下来进入正题。

       对于https,各位肯定很熟悉,也就是浏览器curl里面最前面的那几个字符,最典型的就是https://www+域名这种,而https也就是所谓的密码学协议,全称Hypertext Transfer Protocol Secure,但是至于这个协议如何起作用的,这里面涉及的东西就比较多了,由于https主管通信侧,所以核心问题是如何在互联网这个开放性的虚拟世界里面,建立两个人之间的可信通信信道,以下是具体过程。

        第一,当我们在浏览器输出curl并回车后,浏览器会自动把curl解析成对应ip地址,也就是对应网页服务器所在的ip,此时本地设备会先通过庞大的路由节点,与ip建立连接,也就是找到对方的位置,这个过程俗称TCP三次握手,为的是先确保能够建立通信链路(这个过程和密码学关系其实不大)

        第二,建立通信链路之后,要怎么确保对方一定是正确的服务器呢?这就是TLS加密的开端,需要用数字签名+CA证书+哈希函数(通常为SHA-384)进行操作,首先,服务器会把自己的公钥、域名等信息,提前拿去给CA机构。CA机构用自己的私钥对这些信息进行签名,生成一个数字证书。所以,服务器的CA证书里包含了自己的公钥,以及CA对这份公钥的签名。当本地设备访问网站时,服务器会把自己的CA证书发送过来。本地设备(浏览器或操作系统)内置了信任的CA根证书(即CA的公钥),它会用CA的公钥去解密证书里的数字签名,得到一份消息摘要(Hash值1)。同时,本地设备自己也会用同样的哈希函数对证书内容重新计算,得到另一份消息摘要(Hash值2)。如果Hash值1和Hash值2完全一致,就说明证书内容没有被篡改,且确实是由那个权威CA签发的。最后,再检查证书里的域名和自己正在访问的域名是否一致,就能确认对方的身份了。

       第三,确认对方身份无误后,接下来要做的就是生成对称密钥了(因为高效传输海量信息一般用对称加密,而对称加密的密钥必须双方共享),至于如何生成私钥,就是要用非对称加密了,这里一般是用ECC,也就是椭圆曲线离散对数困难型问题为基础,用ECDHE协议来协商出共享秘密(具体来说,AES的会话密钥,是基于这个共享秘密、加上客户端和服务器的随机数,通过HKDF等等密钥派生函数进一步生成的),当然此处私钥都是在本地,用于后续的加密,到这里TLS加密就结束了。

        第四,这个时候已经有了会话密钥了,然后就可以进行加密了,一般来说,明文数据都是在物理设备本地进行相关的加密,也就是在操作系统的sys程序里面,然后经过网卡包装,加上设备ip,mac等等信息生成数据包,最后呢通过已经建立好的发送出去,而加密的过程就是用对称加密,一般是AES,安全性高而且效率也高。

        一般来说,此时发送出去的数据为密文,就算被劫持也没有大碍,因为第三方既没有你的本地私钥,也没有你的具体加密手段,但是数据到达服务器之后,就会被自动解密成明文,存储在服务器的后端数据库里面,因为之前在本地生成的私钥是本地和服务器共享的,所以说服务器是完全可以解密的,此时想要从web的后端数据库获得明文,就是另外一码事了,(此处说个题外话,如果直接ping任意网页的话,是直接向对应服务器发送icmp数据包,是不涉及TCP三次握手和TLS加密的)

       总之,以上只是我个人关于密码学在https当中实际应用的一些思考,内容深度比较浅,同时也难免有细节有误的地方,欢迎各位老师积极进行指正,同时有好的建议也欢迎指出!我将不吝感激!

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐