对称加密、非对称加密、RSA、消息摘要、数字签名、数字证书与HTTPS简介

1.加密算法简介

加密算法一般分为两种:对称加密和非对称加密。

1.1对称加密(Symmetric Key Algorithms)

对称加密算法使用的加密和解密的密钥一样,比如用秘钥123加密就需要用123解密。实际中秘钥都是普通数据在互联网传输的,这样秘钥可能会被中间人截取,导致加密被破解。其过程如下:

//加密
E=ENC(M,K)

//解密
M=DEC(E,K)

其中M是消息,K是密钥,E是加密后的密文,ENC()和DEC()分别是加密和解密算法。

常用的对称加密算法包括: (1)DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。 (2)3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。 (3)AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

对称加密算法的特点主要有: (1)加密方和解密方使用同一个密钥; (2)加解密的速度比较快,适合数据比较长时使用; (3)密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦。

1.2非对称加密(Asymmetric Key Algorithms)

所谓非对称,是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。把密钥分为公钥和私钥,公钥是公开的所有人都可以认领,私钥是保密的只有一个人知道。

非对称加密算法主要有: (1)RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的; (2)DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准); (3)ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。

假如发送方有一对密钥:私钥(KA)和公钥(KPA),接收方也生成一对密钥:私钥(KB)和公钥(KPB),其中(KPA)和(KPB)是公开的。发送方用接收方的公钥对消息加密,加密过程如下

E=ENC(M,KPB)

接收方接收到密文后使用自己的私钥进行解密,解密过程如下:

M=ENC(E,KB)

这样,即使密文被中间人截获,由于其不知道接收方的私钥,无法破解密文,所以消息仍然是安全的。

1.3非对称加密RSA

RSA加密算法是最常用的非对称加密算法,由Ron Rivest、Adi Shamir、Leonard Adleman于1977年在麻省理工学院工作时提出,RSA是三者姓氏首字母的拼接。

RSA的安全性是基于极大整数因数分解的难度。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

2.消息摘要(Message Digest)

消息摘要可以将消息哈希成一个长度固定的唯一值。值唯一的意思是不同的消息转换的摘要是不同的,并且能够确保唯一。该过程不可逆,即不能通过摘要反推明文。常用的消息摘要算法有MD5、SHA1、SHA256、SHA512等。

3.数字签名(Digital Signature)

有了RSA,我们可以将其用于网络传输数据的加密。比如A要发送一封Email给B,他不想让任何其他人在传输中看到Email的内容,做法就是使用B的公钥对Email加密,只有B的私钥能够解密(B的私钥唯一性保证信件不会泄露)。

某天出意外了,有黑客冒充A给B发送Email,并且也用B的公钥加密,导致B无法区分这封邮件是否来自A。怎么办?此时A可以用自己的私钥加密Email,那么B收到邮件后如果用A的公钥可以解密邮件,那么证明这封信肯定来自于A。

通过这个例子我想我们基本明白非对称加密了的作用了。总结如下: (1)公钥的作用:对内容本身加密,保证不被其他人看到; (2)私钥的作用:证明内容的来源; (3)公钥和私钥是配对关系,公钥加密就用私钥解密,反之亦然,用错的密钥来尝试解密会报错。

仔细思考会发现,假设A用自己的私钥对Email加密发送,会存在下面的问题:对文件本身加密可能是个耗时过程,比如这封Email足够大,那么私钥加密整个文件以及拿到文件后的解密无疑是巨大的开销。使用数字签名可以解决这个问题。 (1)A先对这封Email执行哈希运算得到消息摘要; (2)然后A用自己的私钥对消息摘要加密,生成数字签名; (3)把数字签名加在Email正文后面,一起发送给B。当然,为了防止邮件被窃听,对邮件内容使用B的公钥进行加密,但这个不属于数字签名范畴; (4)B收到邮件后用A的公钥对数字签名解密,成功则代表Email确实来自A,失败说明有人冒充,此时数字签名起到了身份认证的作用; (5)B对邮件正文通过自己的私钥解密后执行哈希运算得到摘要; (6)B会对比第4步数字签名的Hash值和自己运算得到的Hash值,一致则说明邮件未被篡改。此时数字签名用于数据完整性的验证。

整个过程图示如下:

通过上面的例子可以发现数字签名是非对称密钥加密技术与数字摘要技术的实际应用,主要有两个作用: (1)对数字签名使用发送方的公钥解密,根据解密是否成功用于身份认证; (2)将解密后的消息摘要与收到的消息的摘要进行比对,用于消息的完整性校验。

4.数字证书(Digital Certificate)

4.1数字证书的由来

在了解数字签名的由来和作用后,仔细想想你可能会存在如下问题: 公钥是公开的并且可以自行导入到电脑,如果有人比如C偷偷在B的电脑用自己公钥替换了A的公钥,然后用自己的私钥给B发送Email,这时B收到邮件其实是被C冒充的但是他无法察觉。确实存在这种情况,这里问题的根源就在于,大家都可以生成公钥、私钥对,无法确认公钥对到底是谁的。 如果能够确定公钥到底是谁的,就不会有这个问题了。例如如果经过某种检查,能够发现B获取的公钥不是“A”的就好了。解决办法就是数字证书。

4.2数字证书的内容

先大概看下什么是数字证书,一个证书包含的主要内容有(包含不限于): (1)颁发者(Issuer) 指出是什么机构发布的这个证书,也就是指明这个证书是哪个机构创建的,常见的机构有CA(Certificate Authority,数字证书认证中心)。

(2)所有者(Subject) 这个证书是发布给谁的,或者说证书的所有者,一般是某个人或者某个公司名称、机构的名称、公司网站的网址等。

(3)生效时间(Valid from) 证书的有效期起始时间。

(4)失效时间(Valid to) 证书的有效期的结束时间。 过了有效期限,证书就会作废,不能使用了。

(5)公钥(Public key) 这个非对称加密算法中的公钥。

(6)指纹算法(Thumbprint algorithm) 生成数字证书指纹的散列算法,一般为SHA1 。

(7)指纹(Thumbprint ) 根据数字证书中的指纹算法对数字证书进行散列计算获得数字证书的摘要。

(8)签名算法(Signature algorithm) 产生数字证书的数字签名所使用的加密算法。这样就可以使用证书发布机构的证书里面的公钥,根据这个算法对数字证书的数字签名进行解密,获得数字证书的指纹。指纹的加密结果就是数字签名。

注意: (1)数字证书的数字签名是如何产生的? 其过程是对数字证书摘要使用数字证书发行者的私钥采用签名算法进行加密获得,用来保证证书的完整性和确认该证书由数字证书发行者颁发。可见,数字证书发行者除了给别人发布证书外,他自己本身也有自己的证书。

(2)证书发布机构的证书是哪里来的呢? 证书发布机构的数字证书(一般由他自己生成)在我们的操作系统刚安装好时(例如Windows 7等操作系统),这些证书发布机构的数字证书就已经被微软(或者其它操作系统的开发机构)安装在操作系统中了,微软等公司会根据一些权威安全机构的评估选取一些信誉很好并且通过一定的安全认证的证书发布机构,把这些证书发布机构的证书默认安装在操作系统里面,并且设置为操作系统信任的数字证书。这些证书发布机构自己持有与他自己的数字证书对应的私钥,他会用这个私钥加密所有他发布的证书的指纹作为数字签名。

4.3数字证书的申请

举个例子方便大家理解,假设我们公司"Dablelv Inc."花了1000块钱,向数字证书认证中心CA为申请了一张证书。注意,这个证书发布机构CA是一个大家公认并被一些权威机构接受的证书发布机构,我们的操作系统里面已经安装了CA的证书。CA在给我们发布证书时,把Issuer、Subject、Public key、Valid from、Valid to等信息以明文的形式写到证书里面,然后用一个指纹算法计算出这些数字证书内容的一个指纹,并把指纹和指纹算法用自己的私钥进行加密,然后和证书的内容一起发布,同时"CA"还会给一个我们公司"Dablelv Company"的私钥给到我们。我们花了1000块钱买的这个证书的内容如下:

Issuer:CA
Subject:Dablelv Company
Valid from:某个日期
Valid to:某个日期
Public Key:一串很长的数字
{证书的指纹和计算指纹所使用的指纹算法}[CA的私钥|RSA]	//这个就是CA对这个证书的一个数字签名,表示这个证书确实是他颁发的,有什么问题他会负责
...证书其它内容...

其中{证书的指纹和计算指纹所使用的指纹算法}[CA的私钥|RSA]表示使用CA的私钥,采用RSA对证书的指纹和计算指纹所使用的指纹算法进行加密。

注意: (1)如何确保证书的合法性且是我们"Dablelv Inc.“公司的证书呢? 使用者在打开证书时,读取证书中的Issuer为"CA” ,然后会在操作系统中受信任的发布机构的证书中去找"CA"的证书,如果找不到,那说明证书的发布机构是个不受信的发布机构,证书可能有问题,程序会给出一个错误信息。 如果在系统中找到了"CA"的证书,那么应用程序就会从证书中取出"CA"的公钥,然后对我们"Dablelv Inc."公司的证书里面的指纹和指纹算法用这个公钥进行解密,然后使用这个指纹算法计算"Dablelv Inc."证书的指纹,将这个计算的指纹与放在证书中的指纹对比,如果一致,说明"ABC Company"的证书肯定没有被修改过并且证书是"CA"发布的,证书中的公钥肯定是"Dablelv Company"的。对方然后就可以放心的使用这个公钥和我们"ABC Company"进行通信了。

4.4数字证书的发布机构

其实所有的公司都可以发布证书,我们自己也可以去注册一家公司来专门给别人发布证书。但是很明显,我们自己的专门发布证书的公司是不会被那些国际上的权威机构认可的,人家怎么知道你是不是个皮包公司?因此微软在它的操作系统中,并不会信任我们这个证书发布机构,当应用程序在检查证书的合法信的时候,一看证书的发布机构并不是操作系统所信任的发布机构,就会抛出错误信息。也就是说Windows操作系统中不会预先安装好我们这个证书发布机构的证书,不信任我们这个发布机构。

为什么一个证书发布机构受不受信任这么重要?我们举个例子。假设我们开了一个皮包公司来为别人发布证书,并且我和微软有一腿,微软在他们的操作系统中把我设置为了受信任的证书发布机构。现在如果有个小公司叫Wicrosoft 花了10块钱让我为他们公司申请了一个证书,并且公司慢慢壮大,证书的应用范围也越来越广。然后有个奸商公司JS Company想冒充Wicrosoft,于是给了我¥10000,让我为他们颁布一个证书,但是证书的名字(Subject)要写Wicrosoft,假如我为了这¥10000,真的把证书给了他们,那么他们以后就可以使用这个证书来冒充Wicrosoft了。

如果是一个受信合规的证书发布机构,比如你要向他申请一个名字叫Wicrosoft的证书,它会让你提供很多资料证明你确实可以代表Wicrosoft这个公司,也就是说他回去核实你的身份。证书发布机构是要为他发布出的证书负法律责任的。

到这里,你可能会想,那我们自己不就可以发布证书了吗,为何还要花钱去申请?我们自己当然也可以成立证书发布机构,但是需要通过一些安全认证等等,只是有点麻烦。另外,如果数字证书只是要在公司内部使用,公司可以自己给自己生成一个证书,在公司的所有机器上把这个证书设置为操作系统信任的证书发布机构的证书(这句话仔细看清楚,有点绕口),这样以后公司发布的证书在公司内部的所有机器上就可以通过验证了(在发布证书时,把这些证书的Issuer(发布机构)设置为我们自己的证书发布机构的证书的Subject就可以了)。但是这只限于内部应用,因为只有我们公司自己的机器上设置了信任我们自己这个所谓的证书发布机构,而其它机器上并没有事先信任我们这个证书发布机构,所以在其它机器上,我们发布的证书就无法通过安全验证。

4.5数字证书解决公钥的受信问题

了解了数字证书,我们就可以使用数字证书来保证公钥是可信的。

还是以A给B发送邮件为例。 (1)首先A去找证书中心(CA,Certificate Authority)申请数字证书,为公钥做认证。证书中心用自己的私钥,对A的数字证书做了数字签名,生成A的数字证书。

(2)A在邮件正文下方除了数字签名,另外加上这张数字证书。

(3)B收到Email后,从操作系统中受信任的发布机构的证书中去找"CA"的数字证书,从"CA"的数字证书中拿到CA的公钥,用CA的公钥解密这份数字证书,拿到了受信的A的公钥,然后验证数字签名,后面流程不再赘述,参见小节“3.数字签名”。

注意: (1)要是有1万个人要给B发邮件,难道B要保存1万份不同的CA数字证书吗? 不需要,CA中心给可以给B一份“根证书”,里面存储CA公钥来验证所有CA分中心颁发的数字证书。CA中心是分叉树结构,类似于国务院公安部->省公安厅->市级公安局,不管A从哪个CA分支机构申请的证书,B只要预存根证书就可以验证下级证书可靠性。

(2)如何保证CA的根证书的可靠性? CA中心是获得社会绝对认可和有绝对权威的第三方机构,这一点保证了CA根证书的绝对可靠。如果根证书都有问题那么整个加密体系毫无意义。

5.HTTPS简介

数字签名和数字证书可以用于文件,当然也能用于HTML网页数据。HTTPS就是数字签名和数字证书一个具体应用。

5.1HTTPS的由来

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。此外,使用HTTP协议与服务端进行通信时,也无法得知服务端的身份,以及传输数据是否被篡改。总的来说,HTTP的安全缺陷有: (1)无法验证服务端的身份; (2)无法保证数据完整性; (3)无法保证数据传输不被窃听。

HTTPS的出现是为了解决HTTP协议的上述缺陷。HTTPS使用数字签名+数字证书可以解决前两个问题,很多大型网站比如baidu.com都会采用HTTPS协议进行网页传输。

点击可以查看证书,另外浏览器都会内置CA根证书,来对这些网站的服务器证书进行校验。

然后,再用SSL(Secure Sockets Layer)协议对传输通道加密,保证数据传输不被窃听,解决了第三个问题。

5.2HTTPS通信过程

HTTPS协议就是HTTP+SSL协议。HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密。数据是被对称加密传输的,对称加密过程需要客户端的一个密钥,为了确保能把该密钥安全传输到服务器端,采用非对称加密对该密钥进行加密传输,总的来说,对数据进行对称加密,对称加密所要使用的密钥通过非对称加密传输。

下图所示其连接和通信过程:

HTTPS客户端向服务端发起请求连接与安全通信的过程主要有如下几个步骤: (1)建立HTTPS请求 客户端向服务端发送HTTPS请求。

(2)生成公钥和私钥 服务端收到请求之后,生成公钥和私钥。公钥相当于是锁,私钥相当于是钥匙,只有私钥才能够打开公钥锁住的内容。

(3)返回公钥 服务端将公钥(数字证书)返回给客户端,数字证书里面包含有很多信息,比如证书的颁发机构、过期时间等等。

(4)客户端验证数字证书 客户端收到数字证书之后,首先会验证其是否有效,如颁发机构或者过期时间等,如果发现有问题就会抛出异常,提示证书存在问题。

如果没有问题,那么就生成一个随机值,作为客户端的密钥,然后用服务端的公钥加密。

(5)发送客户端密钥 客户端用服务端的公钥加密密钥,然后发送给服务端。

(6)服务端收取密钥,对称加密内容 服务端收到经过加密的密钥,然后用私钥将其解密,得到客户端的密钥,然后服务端把要传输的内容和客户端的密钥进行对称加密,这样除非知道密钥,否则无法知道传输的内容。

(7)加密传输 服务端将经过加密的内容传输给客户端。

(8)获取加密内容,解密 客户端获取加密内容后,用之前生成的密钥对其进行解密,获取到内容。

以上便是HTTPS完整的通信过程。

5.3HTTPS的优点

尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:

(1)使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器; (2)HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、篡改,确保数据的安全和完整性。 (3)HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。

5.5HTTPS的缺点

虽然说HTTPS有很大的优势,相对与HTTP而言,还是存在不足之处。 (1)HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电; (2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响; (3)SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用; (4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗; (5)HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。


参考文献

[1]RSA.百度百科 [2]数字签名原理简介(附数字证书) [3]数字签名.百度百科 [4]数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法) [5]数字证书原理.博客园 [6]通俗理解数字签名,数字证书和https [7]HTTP与HTTPS的区别 [8]HTTPS连接过程以及中间人攻击劫持

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券