对称加密和非对称加密以及数字摘要介绍,以及加密算法在https中的应用
加密算法分类
目前常用的加密算法主要分成三类:
- 对称加密算法
- 非对称加密算法
- 消息摘要算法
在互联网中,信息防护主要涉及两个方面:信息窃取和信息篡改。对称/非对称加密算法能够避免信息窃取,而消息摘要算法能够避免信息篡改。
对称加密算法
发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。
相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。
非对称加密算法
接收方在发送消息前需要事先生成公钥和私钥,然后将公钥发送给发送方。发送放收到公钥后,将待发送数据用公钥加密,发送给接收方。接收到收到数据后,用私钥解密。
在这个过程中,公钥负责加密,私钥负责解密,数据在传输过程中即使被截获,攻击者由于没有私钥,因此也无法破解。
非对称加密算法的加解密速度低于对称加密算法,但是安全性更高。
消息摘要算法
消息摘要算法可以验证信息是否被篡改。
在数据发送前,首先使用消息摘要算法生成该数据的签名,然后签名和数据一同发送给接收者。接收者收到数据后,对收到的数据采用消息摘要算法获得签名,最后比较签名是否一致,以此来判断数据在传输过程中是否发生修改。
无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出,SHA-1的变体可以产生192比特位和256比特位的消息摘要。一般认为,摘要的最终输出越长,该摘要算法就越安全。变长输入,定长输出。
只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。这正是好的消息摘要算法所具有的性质:输入改变了,输出也就改变了;两条相似的消息的摘要确不相近,甚至会大相径庭。从理论上来说,不管使用什么样的摘要算法,必然存在2个不同的消息,对应同样的摘要。因为输入是一个无穷集合,而输出是一个有限集合,所以从数学上来说,必然存在多对一的关系。但是实际上,很难或者说根本不可能人为的造出具有同样摘要的2个不同消息。所以我们选择摘要算法的时候,要注意其安全性。比如现在MD5就是不安全的,已经被国内王小云破解。
消息摘要是单向、不可逆的。只能进行正向的信息摘要,而无法从摘要中恢复出任何的原始消息,甚至根本就找不到任何与原信息相关的信息。当然,可以采用强力攻击的方法,即尝试每一个可能的信息,计算其摘要,看看是否与已有的摘要相同,如果这样做,最终肯定会恢复出摘要的消息。但实际上,要得到的信息可能是无穷个消息之一,所以这种强力攻击几乎是无效的。
消息摘要算法来源于CRC算法,最初CRC算法是用来验证数据完整性的,即我们常见的奇偶校验码、循环冗余校验,在CRC基础上发展处了MD和SHA量大算法家族,CRC比这些算法都要早,MD算法比SHA算法早,SHA算法是对MD算法的改进。再后来则发展出了可以带有密码的消息摘要算法-MAC算法。
消息摘要算法包括三大类,MD、SHA和MAC算法,MD的分类是按照版本规定的,SHA则是按照适用的消息长度分类的:
- MD算法: Message Digest Algorithm ,目前主流的是MD5算法,为第五版算法,之前有MD2、MD3、MD4算法。
- SHA算法:安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。
- MAC算法:带有密码信息的信息摘要算法,是对MD和SHA算法的演变和改进,包括HmacMD2、HmacMD4、HmacMD5、HmacSHA-256等。
对称加密算法
对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yao)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
简介
特点
具体算法
原理应用
加密算法
应用模式
|
加密模式(英文名称及简写)
|
中文名称
|
|
Electronic Code Book(ECB)
|
电子密码本模式
|
|
Cipher Block Chaining(CBC)
|
密码分组链接模式
|
|
Cipher Feedback Mode(CFB)
|
加密反馈模式
|
|
Output Feedback Mode(OFB)
|
输出反馈模式
|
非对称加密算法
工作原理
主要应用
主要功能
主要算法
算法区别
对称加密算法和非对称加密算法对比
对称加密(Symmetric Cryptography)
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。
对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。
对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。
非对称加密(Asymmetric Cryptography)
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
目前最常用的非对称加密算法是RSA算法。
虽然非对称加密很安全,但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。为了解释这个过程,请看下面的例子:
(1) Alice需要在银行的网站做一笔交易,她的浏览器首先生成了一个随机数作为对称密钥。
(2) Alice的浏览器向银行的网站请求公钥。
(3) 银行将公钥发送给Alice。
(4) Alice的浏览器使用银行的公钥将自己的对称密钥加密。
(5) Alice的浏览器将加密后的对称密钥发送给银行。
(6) 银行使用私钥解密得到Alice浏览器的对称密钥。
(7) Alice与银行可以使用对称密钥来对沟通的内容进行加密与解密了。

为什么要使用HTTPS
因为HTTP协议本身毫无安全性可言。
当你访问一个纯HTTP的网站(以及与这个网站有任何网络交互)时,你发出去一个请求。在这个请求到达网站服务器的路途上,不管是你家的路由器、你楼层的路由器、你小区的路由器、你当地电信的机房里,再一直到那个网站的服务器机房之间的所有网络设备上,都有你请求的数据通过。只要中间有任何一个设备想要把数据记录下来,它可以没有任何阻力的做到,因为这些数据是完全可见、没有经过任何混淆和加密的。
如果你发出的是一个注册请求,那这条链路上的每个网络设备都能看见你输入的账号密码;如果你发出的是一个转账请求,每个设备都能看见转账金额和目标。
那是不是只要大家都不在HTTP协议的网站上输入敏感信息,网络就变得安全了呢?
不是。除了你的请求,还有网站的响应数据也完整地走了一遍这条链路,只是方向相反而已。从技术上说,你家买的电信宽带可以篡改网站响应给你的任何信息,假如知乎是个非HTTPS的站点,那运营商可以把上面一句话改成:「你家的电信宽带不能篡改网站的任何信息,他们超级安全」。当然,电信运营商们很良心的并没有篡改HTTP网站的全部内容,只是插了一些广告在网页里。
HTTPS则完全避免了以上的问题。
HTTPS相比HTTP,在请求前多了一个「握手」的环节。在握手时,你和你想访问的网站会交换一个密钥;握手完成后,你的请求先用密钥加密才会发出去,网站服务器的响应会先用密钥加密再传给你。由于整条链路上的节点拿到的数据都是加密过的,所以他们即无法分析出源数据的内容,也无法篡改这个加密过的数据(如果一个节点篡改了加密后的数据,你和服务器都没办法用密钥解密出来,会认为数据是无效的)。
大多数人对HTTPS的了解仅止于此。当我仅仅了解这些知识的时候,反而有了更多的困惑:
1.握手环节交换的密钥难道不会被链路上的节点知道吗? 答案:如果没有证书验证的话,会被中间链路上的设备获取(产生中间人攻击)
非对称加密思想描绘了这样的美好场景:你的手上有两个密钥(一对密钥),它们有一定的关联,但没有办法通过其中一个算出另外一个。你把一个密钥紧紧地攥在手里,永远不向别人公布(私钥);把另外一个发送给我,当然,发送给我的途中,所有的设备都知道了这个密钥(公钥)。之后我用公钥加密了数据,并发送给你,你却可以奇迹般地用私钥解密它。更神奇的是,中间所有的设备,居然都不能用公钥解开它!
2.既然我和网站都能用相同的密钥解密对方的数据,为什么链路上的节点不能用我们交换的密钥解密一下数据呢?答案:因为正常情况下链路上的节点就回去不到交换的秘钥
HTTPS使用的秘钥方案细节
最终HTTPS选择了握手时交换密钥的方案
总的来说,握手过程中,服务器会发出一张证书(带着公钥),客户端用公钥加密了一段较短的数据S,并返回给服务器。服务器用私钥解开,拿到S。此时,握手步骤完成,S成为了一个被安全传输到对方手中的对称加密密钥。此后,服务器与我的请求响应,只需要用S作为密钥进行一次对称的加密就好。
到现在,我们的HTTPS即安全又快了。
中间人攻击
如果没有中间人劫持的话,这篇文章应该就结束了。
毕竟上面的方案看起来已经很完美了,但是事实就是,有这么一种攻击方案可以轻松的突破这一套体系:
- 你和服务器之间有一台邪恶的路由器M
- 当你给HTTPS网站的服务器发请求后,网站带着公钥P响应你
- 响应到达M,M拿到了P,但是并不把它交给你,而是自己伪造了一对公私钥MP和MS,并把MP给你
- 你拿到MP,以为是网站的公钥P,用它加密了S(对称加密秘钥),再请求网站
- 请求到达M,M使用MS解开得到S(对称加密秘钥),再用P加密S交给网站
没错,就这样,邪恶路由器得到了S。至此你和网站的通信不再安全。
HTTPS证书(防止信息窃取)
中间人能劫持成功的本质,还是因为链路是不安全的。所以没有被加密的握手过程一定会有这个问题。
而目前我们解决问题的思路,却是放在了公钥发放上,暂时绕开了这个问题。这就是证书体系(也是为什么你要去找证书签发机构花钱购买证书的原因)。
简单来说,一个HTTPS网站响应给我们的并不是一个公钥,而是证书。证书上包含了公钥,还包含了域名、签发机构、有效期、签名等等。
那证书的安全性怎么保证?为什么中间人不能做一个假证书?
因为这套证书体系已经根植于每一个操作系统里了。每一个操作系统里,都内置了数十张根证书,每个根证书都对应一个非常权威的证书签发机构。这些根证书上记录了各个机构的公钥。
当网站找证书机构购买了一份合法的证书时,网站申请的证书上的公钥、域名、有效期等信息会被计算一次hash,然后证书机构用它的私钥给这个hash加密一次。这个加密结果就是证书的签名。
当网站的合法HTTPS证书到达你的电脑上,这个证书上带有签发机构的信息(具体来说应该是一条证书链),你的浏览器会用这个签发机构对应的操作系统内置根证书上的公钥,去解开网站HTTPS证书的签名(用私钥加密的信息可以用公钥解开)。发现签名解开的hash与证书信息内容的hash一致,就可以证明证书是合法的了。
那中间人能不能申请一个真的证书然后去做劫持呢?
通常来说,证书签发机构的审核非常严格,如果无法证明www.zhihu.com这个域名属于他(备注:申请过程中会让配置,让这个域名返回指定的字符串内容,来验证申请者是域名的负责人),签发机构是不会给他签发一个知乎域名的证书的。而如果中间人用了其他域名的证书,浏览器会发现你请求的域名和返回的证书不一致,从而拒绝继续请求。除非你一定要点下面的「仍然继续」:

最后无奈地说,HTTPS的安全性仍然保证在『证书签发机构一定都是很有良心的』这种脆弱的基础上,当然这个是通过技术手段判断的。
证书相关,再参考下这篇文章,补充过来 https://blog.csdn.net/u013061497/article/details/81639134
数字摘要(防止信息篡改)
数字签名
基本原理
(2) 发送方用自己的私用密钥对摘要再加密,这就形成了数字签名。
参考
对称加密算法
https://baike.baidu.com/item/%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95/211953?fr=aladdin
非对称加密算法
https://baike.baidu.com/item/%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95/1208652?fr=aladdin
数字摘要
https://baike.baidu.com/item/%E6%95%B0%E5%AD%97%E6%91%98%E8%A6%81/4069118?fr=aladdin
非对称加密与HTTPS
https://zhuanlan.zhihu.com/p/37738632
双向https加密 https://www.cnblogs.com/xiohao/p/9054355.html

浙公网安备 33010602011771号