目录
对称加密
非对称加密
证书
既然要保证数据的安全, 就需要加密, 网络传输中不再使用明文和传输了,而是使用加密后的密文, 加密的方式有很多种, 整体可以分为两大类, 对称加密和非对称加密.
对称加密实际上就是通过同一个密钥, 把明文加密称为密文, 然后通过这个密钥, 将密文解密为明文.
一个很简单的例子就是, 按位异或, 假设明文a = 1234, key = 8888, 那么, 我们对这个a\进行加密得到了密文A = a ^ key = 1234 ^ 8888 = 9834. 如果要解密, 就可以对密文A进行相同的异或操作, 也就是a = A ^ key = 1234.
如果客户端要向服务器发送一则明文, 需要对其先进行加密, 中途虽然可能被黑客截获到, 但是因为黑客没有密钥, 所以无法对密文进行解密, 也就无法知道密文里面的有价值的信息, 只能按照原路发给目标服务器, 服务器拥有密钥, 然后就可以通过这个密钥对密文进行解密.
但是事情并没有想象的那么简单, 我们说, 一个服务器可以对很多个客户端提供服务, 也就是说需要同时管理很多个客户端的key,而且每个人用的key必须都是不同的:
此时, 服务器就需要维护记录:
客户端1的key为key1;
客户端2的key为key2;
.........
以此类推..
这么多客户端, 每个人用的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了, 黑客就也能拿到了). 因此服务器就需要维护每个客户端和每个密钥之间的关联关系, 这也是个很麻烦的事情~
因此就出现了一种比较理想的方式, 也就是, 在服务器和客户端建立连接的时候, 就提前协商好这次的密钥是什么.
客户端首先将自己的密钥信息发送给服务器, 但是这个过程中被黑客截获到了, 然后服务器收到之后发送确认信息, 客户端收到这个确认信息之久,就知道了服务器已经知道密钥是多少了, 然后客户端才会发送加密后的密文给服务器, 黑客此时同样可以截获这个密文, 但是, 如果黑客已经拥有了密钥, 那么就可以获取到里面有用的信息.
所以此时如果把密钥的信息也是明文传输的话, 那么前面的加密操作就形同虚设.
因此密钥的传输也需要加密传输. 这就需要另外有一个加密方式了
非对称加密要用到两个密钥, 一个叫做 "公钥", 一个叫做 "私钥".
公钥和私钥是配对的. 最大的缺点就是运算速度非常慢,比对称加密要慢很多
但是这样, 也并非绝对安全, 假设, 这个公钥如果被黑客给伪造了呢? 如果是伪造的, 那么该如何判别呢?
如果使用被伪造的公钥加密, 然后被截取后, 黑客就可以直接还原里面的内容
这就需要下面的证书了:
在客户端和服务器刚一建立连接的时候, 服务器给客户端返回一个 证书.这个证书包含了刚才的公钥, 也包含了网站的身份信息.
证书里面有这些属性:
什么是签名? 签名就是, 先对证书里面的所有属性, 计算出的一个校验和
再由证书颁布机构使用自己的私钥对这个签名进行加密:
对比于非对称加密, 要想要让公钥不被伪造, 就将其换成证书, 如上图,
客户端拿到证书之后, 首先会对证书的内容进行校验, 计算出校验和,然后得到了初始的签名,然后使用权威机构的公钥进行解密, 得到的签名为初始的签名sum1,sum2
如果sum1和sum2不一样, 那么就可以说这个证书被篡改过,否则就是未被篡改过, 那么黑客是否可以为伪造一个证书呢?
事实上是不行的, 在黑客拿到证书之后, 黑客虽然可以进行解密被加密的签名, 伪造证书之后(也就是将证书中的公钥换成自己的, 然后重新计算校验和, 也就是签名), 计算出的签名是无法加密的, 因为如果你要加密, 就需要拿到权威机构的私钥才能加密, 但是这个私钥只在权威机构哪里存在, 且没有直接暴露在网络当中.
如果客户端这边识别到签名没有被加密, 那么就会发现这个证书已经被篡改