目录
1、什么是加密
加密就是对明文数据按某种特殊算法进行处理,使其成为不可读的一段代码,通常称为“密文“, 密文通过”密钥“解密后还原出原来的明文,通过这样的途径可以达到保护数据不被非法人窃取、阅读的目的。
那来看个题,考虑以下哪些属于加密方法:
- AES、RSA、MD5、BASE64、SM4
这几种都是日常开发中常用的数据编码技术,但是只有 AES、RSA、SM4 才能算是加密方法。
为什么呢?一个区分的简单方法就是看编码后的数据是否还能还原,能还原的是加密。
MD5 实际上是对数据进行有损压缩,无论数据有多长,1KB、1Mb 还是 1G,都会生成固定 128 位的散列值,并且 MD5 理论上是不可能对编码后的数据进行还原的,即不可逆。
MD5 因为其具有不可逆性、单向恒定性(相同的数据多次计算值不变)被广泛应用于文件完整性验证、口令加密以及接下来会讲到的数字签名中。
至于 BASE64 是否算做加密方法,仁者见仁。在这里不下结论,因为 BASE64 编码不需要密钥,且编码后的字符串任何人都可以解码出原串,所以一般不认为是加密方法。BASE64 常用来做转码,把二进制字节序列转化为 ASCII 字符序列。
2、加密算法的分类
加密算法按照加解密使用的密钥是否相同,可分为:
- 对称加密(Symmetric Cryptography)
- 非对称加密(Asymmetric Cryptography)
2.1、对称加密
对称加密算法中,加密和解密使用的是同一个秘钥,所以秘钥的保护是非常重要的,对称加密和解密过程如下图:
-
对称算法加密过程
-
对称算法解密过程
尽管对称秘钥能够满足对内容的加密了,但是对称算法还是存在以下两个问题的。
1)秘钥泄密风险:务端与客户端彼此之间必须约定将使用的密钥,而这个约定的过程本身就可能存在泄密的风险;
2)如果有100甚至更多的客户端要向服务器发送文件。那么,服务器可能需要有100多次约定密钥的过程。
由此可见,无论是安全性还是可用性上,对称密钥都是存在问题的。而两个问题则是必须解决的。
2.2 、非对称加密
非对称算法加密和解密使用的是不同的秘钥,加密算法有一对秘钥,分别是公钥和私钥,公钥是公开的,私钥则是自己保管。
-
非对称算法加密过程
-
非对称算法解密过程
3、数字签名和加密
加密是指对某个内容加密,加密后的内容还可以通过解密进行还原。 比如我们把一封邮件进行加密,加密后的内容在网络上进行传输,接收者在收到后,通过解密可以还原邮件的真实内容。
签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过。签名一般是对信息做一个hash计算得到一个hash值,注意,这个过程是不可逆的,也就是说无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密(使用非对称算法的私钥进行加密)后做为一个签名和信息一起发出去。接收方在收到信息后,会重新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里hash计算可以保证不同的内容一定会得到不同的hash值,所以只要内容一被修改,根据信息内容计算的hash值就会变化。当然,不怀好意的人也可以修改信息内容的同时也修改hash值,从而让它们可以相匹配,为了防止这种情况,hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。
数字签名解决了信息安全上面的不可抵赖性和不可篡改性问题。
4、数字证书
基于非对称密钥算法,Bob生成了一对公私钥。Bob将公钥发布在公开的密钥库中。而Alice在向Bob发送加密文件或者验证Bob签名的文件时,均要从公钥库取到Bob的公钥。我们已经知道,一般来说公钥就是一段固定长度的字符串,并没有特定的含义。
为了让Alice能够方便的辨别公钥,我们可以考虑对给公钥附加一些信息,例如该公钥使用的算法,该公钥的所有者(主题),该公钥的有效期等一系列属性。这样的数据结构我们称作PKCS10数据包
公钥的主题我们采用唯一标示符(或称DN-distinguished name),以尽量唯一的标示公钥所有者。以下是基于抽象语法表示法所定义的PKCS10数据结构:
我们已经有了PKCS10数据包,除了公钥信息外,还有公钥的持有者,公钥的版本号等信息。然而这样的数据结构其实并没有任何权威性。例如有一天一个叫做Richard的人想冒充Bob,也生成一对公私钥,并且使用了相同的公钥主题封装为P10数据结构。Alice其实并没有办法分辨哪个是真实Bob的公钥。
为了解决这个问题,就需要一个权威的第三方机构,对P10结构的数据进行认证。就如同对P10文件盖上一个权威的章,防止仿照。这样的权威机构,我们称作CA(Certificate Authority)数字证书认证中心。而CA如何为P10数据盖章呢?非常简单,就是我们前文已经提到的数字签名技术:
① 如上图所示,CA机构其实也持有一张私钥。一般来说,CA会对这份私钥进行特别的保护,严禁泄漏和盗用。
② Bob将自己的公钥附加上一系列信息后,形成了P10数据包(请求包),并发送给CA。
③ CA机构通过其他一些手段,例如查看Bob的身份信息等方式,认可了Bob的身份。于是使用自己的私钥对P10请求进行签名。(也可能会先对数据进行一些简单修改,如修改有效期或主题等)
④ 这样的签名结果,我们就称作数字证书。
数字证书同样遵循一个格式标准,我们称作X509标准,我们一般提到的X509证书就是如此。
5、基于数字证书发送文件过程
基于数字证书,我们可以再来看看Bob如何给Alice发送一份不可否认、不可篡改的文件:
第一步:Bob除了对文件进行签名操作外,同时附加了自己的数字证书。一同发给Alice。
第二步:Alice首先使用CA的公钥,对证书进行验证。如果验证成功,提取证书中的公钥,对Bob发来的文件进行验签。如果验证成功,则证明文件的不可否认和不可篡改。
可以看到,基于数字证书后,Alice不在需要一个公钥库维护Bob(或其他人)的公钥证书,只要持有CA的公钥即可。数字证书在电子商务,电子认证等方面使用非常广泛,就如同计算机世界的×××,可以证明企业、个人、网站等实体的身份。同时基于数字证书,加密算法的技术也可以支持一些安全交互协议(如SSL)。
只要你理解了前面的数字签名,就能理解这里的数字证书,因为我把数字证书叫做「公钥的数字签名」。
为什么呢?我们引入数字证书的目的是为了保证公钥不被篡改,即使被篡改了也能识别出来。而防篡改的方法就是数字签名,但是这个签名不能我们自己做,原因说过了,因为我们的公钥还没分发出去,别人无法验证。
所以只能找可信的第三方来帮我们签名,即证书颁布机构(CA),CA 会将证书的颁布机构、有效期、公钥、持有者(subject)等信息用 CA 的私钥进行签名;并且将签名结果和这些信息放在一起,这就叫做「数字证书」。
这样,Bob 就可以去 CA 申请一个证书,然后将自己的证书发给 Alice,那么 Alice 如何验证这个证书确实是 Bob的呢?
当然是使用 CA 的公钥进行验签:
注意:CA 的公钥也是需要使用证书来分发的,所以 Alice 的电脑必须安装 CA 的证书,证书里包含了 CA 的公钥。
收到 Bob 发过来的数字证书后,Alice 使用 CA 的公钥进行验证,验证通过即证明这确实是 Bob 证书,也就可以使用证书中包含的 Bob 的公钥,按照之前讨论的流程进行通信。
那么 Eve 是否可以在中途篡改 Bob 的证书呢?
答案是不行,因为证书的信息使用 CA 的私钥进行签名,只要 Eve 修改了任何一个 Bit 都会导致最后签名验证不通过;
那 Eve 可不可以修改证书信息后自己重新计算一次证书的数字签名呢?
也不行,因为证书的数字签名计算依赖于 CA 的私钥,Eve 是拿不到 CA 的私钥的;如果拿到了,说明什么?整个世界都是不可信的。
https://www.cnblogs.com/yahoo17/p/13821127.html
3.6 数字证书 章节 解决CA颁发的证书是否被篡改的问题,或者参考如下博客:https://www.jianshu.com/p/29e0ba31fb8d
什么是数字签名?
Bob 得到了两把钥匙。Bob 的密钥之一称为公钥,另一个称为私钥。
Bob 的公钥可供任何需要它的人使用,但他将私钥留给自己。密钥用于加密信息。加密信息意味着“加扰”,以便只有拥有适当密钥的人才能使其再次可读。Bob 的两个密钥中的任何一个都可以加密数据,另一个密钥可以解密该数据。
Susan(如下所示)可以使用 Bob 的公钥加密消息。Bob 使用他的私钥来解密消息。Bob 的任何同事都可以访问 Susan 加密的消息,但没有 Bob 的私钥,数据就毫无价值。
凭借他的私钥和正确的软件,Bob 可以在文档和其他数据上进行数字签名。数字签名是 Bob 在数据上放置的“印章”,这是 Bob 独有的,并且很难伪造。此外,签名确保对已签名数据所做的任何更改都不会被检测到。
为了签署文件,Bob 的软件将通过称为“散列”的过程将数据压缩成几行。这几行称为消息摘要。(无法将消息摘要更改回创建它的原始数据。)
Bob 的软件然后用他的私钥加密消息摘要。结果是数字签名。
最后,Bob 的软件将数字签名附加到文档中。所有经过哈希处理的数据都已签名。
Bob 现在将文档传递给 Pat。
| 首先,Pat 的软件解密签名(使用 Bob 的公钥),将其改回消息摘要。如果这有效,则证明 Bob 签署了该文件,因为只有 Bob 拥有他的私钥。Pat 的软件然后将文档数据散列到消息摘要中。如果消息摘要与解密签名时创建的消息摘要相同,则 Pat 知道签名数据没有更改。 |
情节复杂...
| 道格(我们心怀不满的员工)想欺骗帕特。Doug 确保 Pat 收到一条签名消息和一个似乎属于 Bob 的公钥。帕特不知道的是,道格欺骗性地发送了他使用鲍勃的名字创建的密钥对。如果没有亲自从 Bob 那里收到 Bob 的公钥,Pat 如何确定 Bob 的公钥是真实的? |
碰巧的是,Susan 在公司的证书颁发机构中心工作。Susan 只需签署 Bob 的公钥以及有关 Bob 的一些信息,就可以为 Bob 创建数字证书。
现在 Bob 的同事可以检查 Bob 的可信证书,以确保他的公钥真正属于他。事实上,Bob 公司的任何人都不会接受不存在 Susan 生成的证书的签名。这使 Susan 有权在私钥被泄露或不再需要时撤销签名。甚至有更广泛接受的证书颁发机构对 Susan 进行认证。
假设 Bob 向 Pat 发送了一份签名文档。为了验证文档上的签名,Pat 的软件首先使用 Susan(证书颁发机构)的公钥来检查 Bob 证书上的签名。证书的成功解密证明是 Susan 创建的。证书解密后,Pat 的软件可以检查 Bob 是否在证书颁发机构中信誉良好,以及有关 Bob 身份的所有证书信息是否都没有被更改。
Pat 的软件然后从证书中获取 Bob 的公钥并使用它来检查 Bob 的签名。如果 Bob 的公钥成功解密了签名,那么 Pat 就可以确信签名是使用 Bob 的私钥创建的,因为 Susan 已经证明了匹配的公钥。当然,如果签名有效,那么我们就知道 Doug 没有尝试更改签名内容。
尽管这些步骤听起来很复杂,但它们都由 Pat 的用户友好软件在幕后处理。要验证签名,Pat 只需单击它即可。
4、示例
下面,我们看一个应用"数字证书"的实例:HTTPS 协议:HTTPS = HTTP + SSL。
HTTP 协议是明文传输的,也就是说当数据包使用 HTTP 协议进行传输的时候,如果数据包中途被截下来了,那么里面的数据(明文)就会完全暴露。
因此,如果数据包里面存放着用户的帐号和密码,就可以认为用户的帐号和密码已经泄漏了。
HTTPS 协议则使用了 SSL 对数据进行加密,即使数据被拦截下来,如果没有解密的密钥,也无法得知用户的数据。
客户端向服务器发送数据:
因为服务器的公钥是公开的,所以客户端很容易就能获取得到服务器的公钥。客户端利用服务器的公钥加密数据,这些数据只有存储在服务器的私钥才能解密。
服务器向客户端发送数据:
服务器在向客户端发送数据的时候,除了用私钥加密以外,还要生成一个数字签名。
什么是数字签名?
服务器会使用 hash 函数对向客户端发送的数据生成一个摘要(digest),然后用服务器的私钥加密这一个 digest,得到的就是数字签名了。
当客户端拿到服务器发送的数据后,对数据使用相同的 hash 函数加密一遍,和用公钥解密的 digest 进行对比,如果核对一致则说明中途传输的数据没有被篡改。
考虑第三种情况,如何确保你拿到的服务器公钥确实是正确的服务器的公钥呢?
即有人将其他的服务器的公钥给了客户端,使客户端误以为自己在跟正确的服务器进行交互。(攻击者可以在代理服务器层拦截客户端的请求,再重定向到自己的服务器)
这时候我们需要一个权威的第三方机构(CA)确认这一个公钥确实是真实的服务器的公钥,服务器将自己的公钥和一些私人信息发给 CA,CA 用自己的私钥将这些数据加密之后就是数字证书(SSL证书)。
当服务器向客户端发送数据的时候,还附带上从 CA 下载到本地的证书,客户端拿到证书以后使用CA的公钥进行解密,确认服务器的公钥无误
4.1、首先,客户端向服务器发出加密请求。
4.2、服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
4.3、客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
4.4、如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
4.5、如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
4.6、如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。
————————————————
版权声明:本文为CSDN博主「简一商业」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liwei16611/article/details/83686674