在古时候就有飞鸽传输,快马加书信的方式进行通讯,在传输的过程中如果被他人劫持,将信息内容替换,便很难对信息进行是否正确的判别。慢慢的,人们想出了一种方式,使用一种规则将文字打乱,再用同样的规则将文字复原,这便是加密解密的根源了。
随着时间的流逝,这种规则也慢慢的被出现不同的版本,例如在密码学的原始的凯撒密码。
凯撒密码据说是凯撒在战争中与将军们交流的一种加密的方式,其原理十分的简单,就是让字母都具有统一的偏移量,使得原本正常的文字,在每个字母偏移后形成无法识别的文字。在当时的那个时代,这种方式十分的有效,因为那时候的人们没有现在的人那么精明,很多还是目不识丁的,而且没有计算机去进行枚举解密。
1)哈希(hash)算法 2)对称加密算法 3)非对称加密算法
哈希算法使用的是散列值法,通过一种对应的散列公式将key转换成hash值,也是一种较为优秀的地址存储方式,一般来说,这种算法加密是无法进行破解的,网上所谓的破解一般来说只有以下三种方式:
具代表性的哈希加密:md5加密,sha加密
何为对称,跟照镜子一样,同一个镜子照出的同个人都是一样的,简单来说,就是使用相同的规则进行加密解密,两端通过同一个密钥进行明文的加密和解密,但是这种密钥的传输安全问题又无法得到保障,假设在传输密钥规则的时候被黑客拦截了,黑客知道密钥后也可以直接进行密文解密。因次这种加密算法仍然有弊端存在,在于如何安全的传递密钥。
具代表性的对称加密算法:DES,3DES,AES
非对称加密拥有一套匹配的公钥和私钥,明文可以使用公钥加密成密文,密文再用私钥进行解密成明文,也可以反过来,用私钥加密,公钥继续解密。大致的流程图如下:
(图片来源于小灰)
这时候又有一个问题了:
假设有A端,B端,M端(黑客端)
即使使用非对称加密进行密钥的传输,但是如果在A在传输公钥给B的时候被M拦截了,M传递了自己的公钥给B,B使用公钥将密钥加密后传给A,又被M拦截了,那么M就可以用自己的私钥解密获得了与AB通讯的密钥了,然后M再把密钥用其公钥加密给A,这样AB就在以为正常的情况一直被M获取通讯内容。
如果读者学过网络,应该都是知道网络包的源地址是无法修改的,但是正常来说网站的ip和客户端的ip也并不是一成不变的,原本我以为只要验证源ip即可,但是朋友说服了我,我们不可能去记那么多ip。此时,如何通过第三方权威机构认证来保证安全就很重要了。
web开发的兄弟姐妹肯定对http协议完全不陌生,浏览器请求服务器的资源一般来说使用的都是http协议,只有少数的请求是websocket等,但是这里我想基于前面重点讲讲https的优势。
这几年https开始慢慢兴起,估计很多人都听过一些简单的概念,但是绝大多数的人对其认识仅仅在于:它是一种安全的http协议,是http+ssl构成的,对传递的参数会进行加密。说实话,当初我去面试的时候也是这么回答的。
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的主要区别如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:
(1)使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
(2)HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
(3)HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
(4)谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。
虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的:
(1)HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;
(2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
(3)SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
(4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。
(5)HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行
HTTP内容参考来源:
(https://www.cnblogs.com/wqhwe/p/5407468.html)
原理实际上也是非对称加密加对称加密,基本的过程和上面的整合图是一样的,但是比较重要的一点是ssl证书可以权威认证对方的身份,因此解决了上面所提及的问题。
网上有很多免费使用的证书,有的证书有效期不长,但是可以通过脚本自动免费续签,这里我采用腾讯云的亚洲诚信品牌免费型DV版SSL证书,每个主域可以申请20个证书,且不支持泛域名。
供应商:腾讯云主机
os : Ubuntu14.04
环境: php7.0+apache2+mysql
1)首先得有一台正常的服务器可以跑基本的http协议的页面
2)申请证书:
3)下载证书并扔到服务器上:
在证书列表选择对应的证书下载即可,下载完后是一个压缩包,解压获得4个文件夹,分别是 Apache、IIS、Nginx,Tomcat 服务器的证书文件。此时你可以使用winscp,filezilla等工具上传文件,不过我这里建议直接使用命令方便点吧。linux有rz,sz命令,可以用来上传和下载文件,如果你没用过肯定是要装了.
centos(yum install lrzsz)
ubuntu(apt-get install lrzsz)
把对应文件夹的三个文件上传到服务器任意目录中,但是你要记得放在哪里,
4)配置Apache文件
首先,先启用ssl模块:sudo a2enmod ss
然后打开打开文件 /etc/apache2/sites-enabled/000-default
增加如下配置:
<VirtualHost 0.0.0.0:443>
DocumentRoot "/var/www/html" #你的网站根目录
ServerName www.domain.com #域名信息
SSLEngine on
SSLCertificateFile 你放的文件夹/2_www.domain.com.crt #上传的证书文件位置
SSLCertificateKeyFile 你放的文件夹/3_www.domain.com.key
SSLCertificateChainFile 你放的文件夹/1_root_bundle.crt
</VirtualHost>
上面的两个文件的名称记得替换成你实际文件名称
然后,重启Apache,service apache2 restart
如果启动成功,就OK了!
因为总共可以申请20个免费证书,因此如果你有多个子域名,那么就为每个子域名也申请一个证书,然后在对应域名的配置文件中加入跟上面类似的配置即可。
哈哈哈,我的小锁头终于有了。