本篇对web安全中一些常见概念做个基本介绍,并最终整合为https的整个流程。本文介绍的加密方法纯属个人虚构,与现实无关。因为现实中的加密算法太过复杂,暂不讨论。这里只用最简单的方法举例,只把概念讲清楚,也不考虑破解的可能性。
凯撒密码
这是凯撒当年的军用密码,是最古老,也是最简单的一种密码。举个例子:
明文:ok
密文:rn
加密方式很简单,将明文字母向右偏移三位,o就是r,k就是n。解密就是反方向偏移三位。
密钥
上面凯撒密码的密钥就是3。发消息时使用密文传输,即使被黑客拦截,他无法理解rn是什么意思,只有拥有密钥的人才能解密真正的消息明文,而密钥只有发消息和收消息的人才知道。
随机数(加盐)
假如收信人每次收到rn都会去做同样的事情,那么黑客再拦截到rn密文时,他不用破解就可以预测到收信的人行为了,他甚至可以主动给收信人发rn,从而在需要时控制收信人。
随机数的作用就是使密文变的不可预测,假如随机数是5,5*1=5,密文将偏移5位,同时将随机数5也发给收信人。接收人也用相同的算法5*1=5,从而得知这一次的解密密钥是5,要反向偏移5位而不是固定的3位。并且随机数是不可重复的,这样每次的密文都会完成不同,无法预测。
散列值(消息摘要)
有时候我们下载一些文件,对方可能还会提供散列值,比如md5、sha大家应该不会陌生吧,它们都是生成散列值的不同算法。厂商将原始文件通过一定算法生成散列值(一串字符串),公布出来。用户下载后,自己再用工具算一遍,得出的散列值相同,说明文件没有被擅改过。如果不相同,你下载的文件有可能已经被黑客植入恶意脚本。
生成散列值的过程是不可逆的,比如20(原文)除以8(散列算法)等于2(散列值),余数4被丢弃了,所以2和8是不可能倒推出20的。而我们拿到20再算一遍,必然得出结果2,和厂商比对一样,说明20就是原文件,没有被擅改过。
不论原始文件或消息有多么大,最终生成的散列值都可以是非常简短的,可以反复做除法,一直除到想要的长度,这样便于传输携带。
非对称加密
在互联网上,我们通常不会只和一个用户通信,假如他们每个人都知道我们的密钥,那他们就可以互相解密了。你也可以给每个用户都单独配一个不同的密钥,但如果我们的用户非常多,要管理这么多的密钥是非常麻烦的事情。
非对称加密指有两个密钥,公钥和私钥,成对出现 。公钥是公开的密钥,所有用户可以用它加密,不能解密。而私钥是服务器私有,只能解密,不能加密。从而保证所有人发的消息只有服务器能看到。也可以反过来,用私钥加密消息,用公钥解密,可以保证消息确实是服务器发出的。
比如上面说的20除以8等于2,丢弃余数4,从而使2和8无法倒推出20。假如现在服务器知道余数是4,不就可以倒推了吗?我们提前做几道算法:2*8+4=20,3*8+4=28。。。假如原文是49,加密时随机将其拆分成20+28+1。根据前面的算法,20=2,28=3,多出的尾数1保留,密文就是231。由于不知道余数4,黑客即使知道算法*8和尾数1,也无法通过231还原出49。而我们知道余数4,就可以用2还原出20,用3还原出28,最后20+28+1得出原文就是49。而余数4就是我们的私钥。
非对称加密虽然安全性更高,但从上面就可以看出,非对称加密比对称加密复杂的多,性能也低的多。所以它并不能完全取代对称加密,只适合对一些较短的关键性的内容加解密,如下。
数字签名
散列值保证了消息完整性,而且简短便于传输,但是无法确认消息来源。黑客可以拦截消息,然后冒名发出一条假消息,并相应生成假消息的散列值,发给收信人。收信人比对散列值一致还误以为是真实服务器发出的。
数字签名和现实中的签名作用一样,用于识别身份,而且非常简短。比如:采用非对称加密技术,发信人用私钥对散列值进行加密,收信人用公钥解密出散列值。因为只有私钥才能加密,加密后的内容就相当于个人签名,只有与其对应的公钥才能解密,只要能解密成功就能证明消息来源的真实性,伪造的签名是无法被特定的公钥识别的。然而公钥就一定是安全的吗?
证书
用户的公钥都是从网上获取。而黑客同样可以进行拦截,并将黑客的公钥替代服务器的公钥发给用户,用户用公钥加密后,黑客可以用他的私钥直接解密。此时就需要第三方认证机构对公钥进行认证了。
1,如果服务器需要认证,则向认证机构申请。
2,认证机构用自己的私钥对服务器的相关信息(包含公钥)进行数字签名,相关信息和签名就构成了服务器证书。
3,用户访问服务器时,服务器将其证书发给用户。
4,用户在安装window操作系统时,默认会安装受信任的认证机构的证书,证书中也包含认证机构的公钥。用户浏览器用认证机构的公钥,解密服务器证书的数字签名,得到散列值。然后将服务器证书中的公钥与散列值(摘要)进行比对,从而确认服务器公钥的真实性。所以,如果你的服务器操作系统不是正版的,或散列值比对不一致,那从根本上就无法保证服务器的安全性。
https
理解了以上内容,基本上就可以明白https的通信过程了
1,客户端发起请求,和服务器协商将使用的加密算法,传输协议等信息,这些内容都是公开的。
2,服务器将自己的证书发给客户端。
3,客户端验证证书合法性。
4,客户端生成对称加密密钥,用服务器证书中的公钥对密钥加密,发给服务器,服务器用私钥解密拿到对称密钥。
5,安全性相关工作全部确认完闭,客户端和服务器开始使用对称密钥发送业务消息。
对称密钥
以上https可以发现,低性能的非对称密钥只是用在安全确认环节上,只对较短的关键内容进行加解密。而消息的内容有可能是非常长的,比如一个html上千行代码,此时用对称密钥性能更高,最后生成的对称密钥也只有服务器和客户端彼此知道。