之前一直对于https原理比较迷惑,只是知道是http的安全版,花了些时间学习,发现讲解https的博客有很多,但是知识点比较散乱,不成系统。这里列举下我对https的认识,有错误希望支持。
hash算法
Hash算法是一种单向算法,可以对目标信息进行加密生成一段特定长度的Hash值,但反过来却不能对这个Hash值进行反向运算得到目标信息。即使修改文本的一个字节,采用hash算法hash值会有很大不同。Hash算法常用于信息完整性和可信性的校验。
举个例子: 例如tomcat官网[http://tomcat.apache.org/download-native.cgi],展示了每个现在文件的采用不同hash算法得到的hash值,如果一个用户下载了对应的安装包,那怎么取验证该安装包是否被篡改呢?将该安装包采用每一种hash算法计算该文件的hash值然后与官网比对,如果不一致,代表该文件被第三方篡改了。常用的有MD5,SHA等加密算法。
加密算法
加密算法分成对称加密和非对称加密
对称加密: 加密和解密使用相同的秘钥,优点加密算法简单快速,缺点双方共享同一个秘钥,技能加密也能解密,安全性较差。常用的加密算法有DES,AES等算法
非对称加密:加密和解密使用不同秘钥,加密采用私钥,解密使用公钥。优点私钥自己保管,公钥可以随意对外公开。非对称加密最常见的就是RSA加密算法。
采用http有哪些不好?
http最大的隐患是用户的信息在公网中都是采用明文传输的,想象下我们的支付宝账号和密码如果是明文传输,万一在运营上某个路由器上被黑客劫持怎么办,就好比“出门没有穿裤子”
另外http在公网中明文传输,网络运营商加点内容(比如广告)易如反掌。
https工作原理
- 浏览器将自己支持的一套加密规则(包括加密算法和hash算法)发送给网站。
- 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
- 获得网站证书之后浏览器要做以下工作:
- 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
- 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
- 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
- 网站接收浏览器发来的数据之后要做以下的操作:
- 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
- 使用密码加密一段握手消息,发送给浏览器。
- 浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
有了对称加密的秘钥,也就是上面的随机密码 再采用约定好的对称加密算法,就可以安全的传输用户名和密码了。
https是不是一定安全呢?
假如客户端在上述步骤1中,请求被拦截,发送到一个坏的黑客服务器中了呢?假如黑客服务器按照上面相同的方法跟客户端进行https安全握手,那岂不是照样不安全吗?
要解决这个问题,关键在上面第3步中第1)小部,验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),这个就是CA(第三方可行机构),如果要发布一个服务采用https,大公司都会想CA购买证书,CA机构颁发的证书非常昂贵。如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
如果浏览器提示了证书不受信任,用户仍然点击确认,是一个安全网站还好,如果是一个钓鱼网站就怪不了别人了。