服务器可以创建出一堆公钥和私钥,黑客也可以按照同样的方式,创建一对公钥和私钥,冒充自己是服务器(搅屎棍)
pub2
之后,无法区分 pub2
是否是服务器的,于是就拿着 pub2
就对 key
进行加密了pri2
对上述数据进行解密,然后黑客就拿到了 key
pub1
对 key
进行加密,传给服务器·pri1
来解密,于是知道了对称密钥是 key
。后续的通信,服务器和客户端之间,仍会继续使用 key
作为加密的密钥。此时后续传输的各种数据就可以被黑客解密了针对中间人攻击,怎么解决?
最关键的一点,客户端在拿到公钥的时候,要能有办法验证,这个公钥是否是真的,而不是黑客伪造的。这就要求服务器这边,要可以提供一个“证书”
证书是搭建服务器的人,要从第三方的共振机构进行申请的
证书里面包含:
此处的签名本质上是一个经过加密的校验和
颁布证书的公证机构,会在颁布证书的时候,给这个证书计算出校验和。然后公正机构会使用自己的私钥(和服务器的私钥无关),针对校验和进行加密,此时就得到了证书的签名
客户端拿到证书之后,主要做两件事:
此时,就可以对比,这两个校验和是否一致。若一致,就说明证书是没有被修改过的,就是原版证书;若不一致,就说明证书被人篡改过了(比如黑客如果替换了自己的公钥,此时出来的校验和一定发生变化),此时客户端就能识别出来了
市面上的公正机构一共也没多少,这些公正机构都有自己的私钥,对应的公钥都包含在常见的系统中。Windows 里面就内置了大量的公钥(如果没有,也可以额外安装)
证书是为了防止黑客篡改,而不是为了避免黑客知道。黑客的系统也内置了公正机构的公钥,黑客也能进行解密
当然,上述的过程,所谓的安全,也不是绝对的安全。上述的安全本质上都是基于非对称加密体系。非对称加密体系也不是无懈可击的,只不过破解这样的加密体系,需要的计算量非常大,超出了现有计算机的算力上限。
随着算力的提升,尤其是量子计算机崛起,我们的算力又会大幅度提升,对现有的密码学体系就会造成重大冲击