【区别】摘要、数字签名、数字证书
1、摘要
一段信息,经过摘要算法得到一串哈希值,就是摘要(dijest)。
信息是任意长度,而摘要是定长。
摘要算法有MD5、SHA1、SHA256、SHA512等,算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同)
摘要不同于加密算法,因为不存在解密,只不过从摘要反推原信息很难(可以认为能加密但无法解密还原,但可以用于比对)。
摘要相同,信息一定相同。如果两张图片的md5相同,说明图片完全一样,不需要重复爬取。
利用这个特点,摘要还可以用于应用在网站后台数据库中,用于比对用户的输入密码和预设密码是否相同。这里都无需关心密码本身是什么,关注的是密码是否相同,而密码是否相同取决于摘要是否相同,所以问题转化成了摘要是否相同。将用户密码的摘要而不是密码本身保存在数据库中,因为反推很难,所以真实密码是保密的……非要暴露的话,也是通过比对而不是反推。
2、非对称加密算法
算法重要的概念是公钥和私匙。
先有私钥,再用函数生成公钥。公钥包含了私钥的信息,但也掺杂了其他随机变量,因此不能反推。
私匙不要泄露,公钥要告诉和你通信的对方。公钥加密,只有对应私钥能解开(保密);私钥加密,只有对应公钥能解开(不可抵赖)。
具体有两种情形:
(1)对方用你的公钥加密信息,你收到后用私钥解开。
只有你有私钥,所以只有你能解开,换句话说,有私钥才能看到信息,很安全。
(2)你拿私钥加密信息,对方收到后用你的公钥解开。
公钥是公开的,所以其他人也可以看到你的信息,不保密。
私钥加密,只有对应公钥能解开。既然用你的公钥能解开,说明加密一定是你的私钥。私钥只有你有,所以一定是你发送的,你不可抵赖。
3、数字签名
摘要经过加密,就得到数字签名
数字签名在发送方,分两步:(1)从内容算摘要(哈希算法)(2)从摘要明文到摘要密文,也称数字签名(发送方私钥+加密算法)
数字签名验证在接收方,分两步:(1)从摘要密文(数字签名)到摘要明文(发送方公钥+解密算法)(2)从收到的内容当场计算摘要(哈希算法),与(1)的结果比对是否一致
如果一致,可以说明两点:
(1)内容未被篡改(摘要一致)
(2)内容只能是私钥拥方发送,不可抵赖(密文能够用对方的公钥解开)
然后单独想一下,
(1)为什么要对摘要加密后再发送?为什么不直接发摘要?摘要不可以逆向推导原文,摘要泄露了也没事……
答:摘要泄露是没事,但不怀好意的人的目的可能并不在想要窃听你发送了什么,而是想伪造发送的内容让你相信。通过同时替换摘要和内容,很简单就实现了。所以摘要需要经过加密,不怀好意的人没有私钥,无法完成加密。或者说你收到的东西只要能用公钥解密,你才认为这个东西确实是对应私钥持有者完成的。这叫做当事人不可抵赖,同时别人无法仿冒。(数字签名:不可抵赖+无法仿冒)
(2)为什么不直接对内容加密,而是先生成摘要,对摘要加密?
答:可能是内容很长吧,直接加密算半天!摘要算法可以把无限长的内容输出成长度固定的摘要,再进行加密时间就是可以预估的
4、数字证书
上面的一切都很完美,你用公钥能够解密,说明确实是私钥方发送的,你很放心……
但有没有想过,万一这把公钥本身,就被人做了手脚???
为了保证“公钥”是可信的,数字证书应运而生。
数字证书里有个重要概念,CA,发送方先把自己的公钥给CA,CA对其进行加密得到加密后的发送方公钥(用的是CA的私钥和CA加密算法),也就是CA的数字证书。
注意这里有两个不同的非对称算法(对应2个公钥私钥对),一个算法是发送方加密摘要的,用于生成数字签名;另一个算法是CA加密发送方公钥的,用于生成数字证书。两个算法相互独立,没有必然联系。
发送时不仅发送内容、数字签名,还包含发送方的数字证书。接收方拿到后,首先从数字证书中解密出发送方公钥(用的是CA的公钥和CA解密算法),这个公钥必然是可信的。然后就是和前面一样的流程,拿发送方公钥去解密数字证书,得到摘要;最后比对摘要是否一致。
一个问题:既然数字证书是为了保证发送方公钥不是别人伪造的,那怎么保证“CA”的公钥不是伪造的呢?
答:CA是第三方机构,CA公钥是公开的,接收方可以跟别人比对(比如在网上查询),因此不可能伪造。但是发送方公钥,接收方是通过通信得到的,收到后无法验证。
【实例1】https
工作流程,基本分为三个阶段:
1、认证服务器。浏览器内置一个受信任的CA机构列表,并保存了这些CA机构的证书。第一阶段服务器会提供经CA机构认证颁发的服务器证书,如果签发该证书的CA,存在于浏览器的受信任CA列表中(也就是签发该证书的CA的根证书,能够与客户端中保存的CA根证书比对上),说明这个CA是可信任的,可以保证证书不假。然后,再进一步判断服务器证书中的信息与当前正在访问的网站(域名等)一致,那么浏览器就认为服务端是可信的,并从服务器证书中取得服务器公钥,用于后续流程。否则,浏览器将提示用户,根据用户的选择,决定是否继续。 客户端是否能够信任这个站点的证书,首先取决于客户端程序是否导入了证书颁发者的根证书。
2、协商会话密钥。客户端在认证完服务器,获得服务器的公钥之后,利用该公钥与服务器进行加密通信,协商出两个会话密钥,分别是用于加密客户端往服务端发送数据的客户端会话密钥,用于加密服务端往客户端发送数据的服务端会话密钥。在已有服务器公钥,可以加密通讯的前提下,还要协商两个对称密钥的原因,是因为非对称加密相对复杂度更高,在数据传输过程中,使用对称加密,可以节省计算资源。另外,会话密钥是随机生成,每次协商都会有不一样的结果,所以安全性也比较高。
3、加密通讯。此时客户端服务器双方都有了本次通讯的会话密钥,之后传输的所有Http数据,都通过会话密钥加密。这样网路上的其它用户,将很难窃取和篡改客户端和服务端之间传输的数据,从而保证了数据的私密性和完整性。
客户端是否能够信任这个站点的证书,首先取决于客户端程序是否导入了证书颁发者的根证书。
服务器找CA签发证书,以及客户端识别证书的过程(加密机找CA签证书基本也是这个流程,只不过两台加密机通信,两台都要签证书)
IE浏览器在验证证书的时候主要从下面三个方面考察,只要有任何一个不满足都将给出警告
- 证书的颁发者是否在“根受信任的证书颁发机构列表”中
- 证书是否过期
- 证书的持有者是否和访问的网站一致
这会儿我正好在装Fiddler。默认Fiddler不对https traffic加密,如果勾选,就会弹出如下对话框,大意是:Fiddler会在https流量收发双方中间,类似代理的角色,为了参与https通信,Fiddler自己也要有一个证书,然后这个证书由一个CA颁发,现在这个CA的根证书需要导入windows,用户需要让windows信任这个CA。
之后是windows的警告:因为在往系统里加一个新的CA根证书,windows并不确定这个根证书是否是真的,所以问你(根证书责任重大,选择相信根证书意味着相信这个CA的一切操作……))
【实例2】加密机
个人理解,可能有错。欢迎指正~
加密机A和加密机B双向通信,没有绝对的客户端和服务端之分。或者更准确地说,每台加密机既是服务端,需要找CA给自己签个签证书;也是客户端,需要提前导入CA根证书,用于识别收到的证书是否是可靠CA签发的(比对收到证书的根证书是否在可靠CA列表中)。CA签发证书的过程,就是对【包括发送方公钥在内的发送方信息】进行加密(用CA加密算法和CA私钥)。因此签出来的证书,在接收方可以被解密得到【包括发送方公钥在内的发送方信息】(用CA解密算法和CA公钥)。
此外,A需要导入B的证书,B需要导入A的证书。
上述准备工作(初始化)完成后,A和B首先建立连接(不涉及应用数据,只是协商一致建立一条加密隧道),其实就是A需要验证现在与我通信的另一端、证书里生成的B,是不是真正的B。这个就依靠B发送自己的证书给A,A收到后首先确认这个证书颁发CA是可靠的(依据CA的根在自己的可靠根列表中),说明证书可信,再从对证书进行解密(CA的公钥+CA解密算法),得到【包括B的公钥在内的B的信息】,据此证明对端就是真正的B,并拿到了B真正的公钥,验证完成。同理,B也要验证对端确实是A,就不再赘述。
互相验证完成后,A与B的链接建立,等待真正的数据收发。之后的加解密,应该就是加密机自己的算法和秘钥了,硬件上是由加密卡完成,加密卡也是加密机最值钱最核心的部件……
(加密机部分纯属个人理解,欢迎指正。有时间我会再带着这个思路去阅读加密机的说明书……)
转载:https://zhuanlan.zhihu.com/p/32754315