一、公钥私钥的作用
情景1:hostA和hostB两台机器,A希望发送的email只给B看到:所有A可以将email使用B的公钥加密,B拿到后可以用B的私钥解密。当A发送的email被黑客拦截,因为没有B的私钥,所有依旧无法阅读email内容。
情景2:有个黑客冒充A使用B的公钥加密了一封有病毒的Email给B,B以为是A的,贸然解密容易造成病毒威胁,那么B该如何验证该Email的确来自A呢?
将加密的Email再用A的私钥加密,收到邮件后先用A的公钥解密再用B的私钥解密即可。
总结:
公钥的作用:对内容本身加密,保证不被其他人看到。公钥加密需用私钥解密,一般发送方将信息用目标主机的公钥加密信息,可以保证只有目标主机(的私钥)才能解密。
私钥的作用:证明内容的来源。私钥加密需用公钥解密,私钥一般用于证实信息来源,发送方用自己私钥加密的内容,目标主机用发送方的公钥能正确解密可以保证发送来源是否准确。
二、数字签名
上面的情景1中存在的问题可以通过情景2的方式解决,因为情景2中使用了发送方A的私钥再次加密,这个私钥是A独一无二的,所以即使被拦截修改后,黑客没有A的私钥加密回去,B接受到之后也无法通过A的私钥解密。数字签名雏形初现,下面将一下数字签名
情景1中,因为A使用B的公钥加密,发送给B,B用自己的私钥解密才能阅读邮件内容,确保了只有正确的目的端才能解密到邮件内容。那么能否保证消息来源端的准确性呢?也就是说如何保证发邮件给B的是A。
我们知道B的公钥大家很容易拿到,假如考虑B只接受A给自己发送邮件,黑客X通过某种手段获取了B的公钥,给B发送了病毒文件,B如何判断该邮件是来自于A还是黑客X?
情景3 我们使用A的私钥加密信息再发送给B,但是如果文本内容很大,最后B使用A的公钥解密的时候需要大量的开销,这时候,我们考虑使用哈希算法把A的内容计算得到一个hash值,然后用A的私钥加密这个hash值即可。注意这个hash值是用A的私钥加密得到,是A独一无二的标志,我们把这个叫数字签名,可以理解为我们签合同时候使用的独一味二的指纹!把数字签名加到邮件内容中一并发送给B,这时候B收到后用A的公钥解密这个邮件的数字签名,解密成功了,说明这个邮件的确是A发来的,我们再计算一次hash值看看和发来的数字签名是否一致便知道内容是否发生了篡改,因为数字签名是由A是私钥加密的,即使内容发送篡改,我们也可以通过从新计算哈希值验证。
注意: 可以看出我们这里数据是明文传输的,存在窃听风险。但是我们为了阐述数字签名机制是如何运转的,故意将保证信息机密性的机制省略了。
如果想要保证数据的机密性,我们常见的做法是,通信双方通过非对称加密安全交换对称加密的密钥,后续通信过程的数据都使用对称加密保证数据机密性。 并且「签名」的作用本身也不是用来保证数据的机密性,而是用于验证数据来源的防止数据被篡改的,也就是确认发送者的身份。
三、数字证书
对于情景3:能够保证不被篡改AB正常通信的前提是B上存在A的公钥,这样A的数字签名才能被解密,再往前考虑一步在A把公钥发给B之前,黑客将自己的公钥冒充A发给B,让B保存下来,误以为是A的公钥,这样,当A真正发送数据给B的时候会拿黑客冒充的公钥去解密数字签名,自然就会失败,这样B只能接受黑客发送的消息了。这就引出一个问题,A发给B的公钥如何保证的确是A发来的,而不是别人冒充的!
这时候就需要一个第三方机构,即证书颁布机构(CA)CA 会将:证书的颁布机构、有效期、公钥、持有者(subject)等信息用 CA 的私钥进行签名。并且将签名结果和这些信息放在一起,这就叫做「数字证书」这样A去申请一个证书,然后将这个证书发给B,这样B自然就获取了可靠的来自A的证书。那么B如何确认这个证书的确是A的证书?当然是使用CA的公钥验证拉
注意: CA 的公钥也是需要使用证书来分发的,所以 A的电脑必须安装 CA 的证书,证书里包含了 CA 的公钥。
(这就保证了公匙不需要在两者间传递,防冒充)
B收到来自A的证书,从证书中拿出CA的公钥验证确实来自A。那么有没有一种可能黑客拦截了证书进行了篡改,答案是不行的因为数字证书是使用CA的私钥进行签名的,黑客修改任何一个bit都不能通过校验;那 黑客可不可以修改证书信息后自己重新计算一次证书的数字签名呢?也不行,因为证书的数字签名计算依赖于 CA 的私钥,Eve 是拿不到 CA 的私钥的。如果拿到了,说明什么?整个世界都是不可信的。
四、总结
数字签名保证信息来源可靠,用私钥对摘要进行加密,做到防伪,防篡改
数字证书保证了公钥安全分发,奠定了信任链的基础