加密
明文P,加上密码W一混淆之后,变成密文M如果不知道W,则无法从M反推回P。也就是无法进行解密。类似这种加密方式,称为对称加密。也就是加密、解密使用的密码是一样的。
实际上加解密并不是直接使用密码,而是经由密码生成的密钥。这种算法有很多,比如AES。另外还有一种神奇的加解密算法,叫做非对称加密。比如RSA。非对称加密使用的密码有一对,一个称为公钥Pub,一个称为私钥Priv。明文P,经过公钥Pub使用RSA加密算法一混淆之后,变成了密文M。这个密文M,用公钥Pub是解不开的,需要用私钥Priv来解密。
同样地,明文P,经过私钥Priv使用RSA加密算法一混淆之后,变成了密文M。这个M,也只能用公钥pub来解密。所谓公钥,就是可以公开出去可以供所有人使用的密钥。不像对称加密里的密码,要小心翼翼的存着。
还有一种算法,叫做hash算法。是单向加密。就是只能从明文得到密文,却无法从密文得到明文。这种算法有一个好处,就是明文哪怕只有一位不一样,加密后得到的密文也不一样。所以常用来进行比较明文是否被篡改过。
有了以上的基础,就可以开始说数字证书了。
数字证书
首先,有一个权威的证书签发机构,称为CA——全球就那么几个公司比较权威啦,这个机构,先用RSA产生一对公私钥。私钥自己留着藏起来,你要是能偷到手就厉害了。
然后用自己的私钥对自己的公钥进行签名,生成所谓的数字证书。这个过程大概是这样的:先生成一个文件,文件内容大概是这样的:公钥内容签发者ID----谁签发的证书Subject----也就是这个证书签发给谁。这里subject和签发者ID相同。有效期其他信息以上内容都是明文。我们称为内容P。
然后使用hash算法,对内容P进行hash计算,得到一个hash值H。然后使用签发机构的私钥对H进行RSA加密,得到签名信息S。这个步骤称为签名,就是用私钥对某公开内容的hash值进行加密。
然后将P,S连成一个文件,这个文件就是所谓的数字证书了。所以数字证书里,包括证书持有者的身份信息,证书信息,证书持有人的公钥,以及签名信息。
现在假设某人得到了这个证书,如何确认这个证书属于谁的呢?我们看数字证书里有些什么?可以得到P,可以得到S。我们用同样的hash算法对P进行hash计算,得到一个hash值H1.P里有公钥,签发者ID,Subject,有效期,及其他信息。我们用公钥解密S,得到了一个值H’。这个H‘,正常情况,或者说期望正常的话,应该就是制作数字证书的时候,用私钥对S加密的H。
是否真如期望一样呢?比较一番就知道了。现在对比H’和H1是否相等,如果相等,那么就证明这个证书是有签发者签发给subject的证书,就是符合期望了,也就是正常情况。否则就说明:1.内容P被篡改过,或者2.证书不是由CA签发的。
这个是对自签发证书的验证过程。需要说明的是,这种自签发证书的验证不常使用,但如何验证证书的原理类似。既然自己可以给自己签发证书,那黑客宣称自己是某著名CA,然后给自己签发一个证书。那验证者如何来验证这个证书是黑客自己的呢还是那个著名的CA呢?如果仅仅按照上文所说的自签发证书验证过程来看,是无法确认身份的。啥?那搞毛啊?不要急,这个问题,就是CA存在的意义了。
所谓全球权威的CA,就那么几个公司,这几个公司的证书,被各软件厂商设置成“可信任的根证书”了。所谓的根证书,是指这个证书是受信任的起始点,随后可以用这个证书来证明其他的证书。就好像你爸爸绝对相信你是好人,然后你再证明你的朋友A是好人,于是你爸爸相信A也是好人一样。所谓其他的证书,自然就是由CA签发的证书了,这些证书无法享受CA可信任的根证书待遇。至于这些CA是怎么把自己的数字证书交给软件厂商而且让他们信任自己,我也不知道。如果你知道了,你就可以自己给自己签发一个证书,交给微软的IE,或者firefox等,让他们把你的证书嵌入到软件里去。这样一来,你就成了全球权威的CA之一了!
现在知道了,自签发的数字证书,要被各软件信任,是不容易的。一旦CA的根证书存在用户的系统了,就可以用这个根证书来验证其他证书了。并用被验证过的证书来认证身份。嗯,这句有些绕,继续看下文。我们举一个例子,说明数字证书用来进行身份认证,就是https连接某网站的时候的身份认证过程。
首先,某网站当然是一个web服务器,它要有一个数字证书。这个证书,要么是自己签发的,要么是由第三方签发的,一般这个第三方是全球权威的CA。IE或者firefox用https连上web server,这个时候,IE或者firefox最担心的是这个web server是冒充的网站,比如我登录某银行网站,结果连上了一个钓鱼网站,用户也没有发现,就在这个钓鱼网站做的和真网站一样的页面里,输入了自己的用户名密码,岂不是就这么泄露了机密信息么?那么怎么确认这个网站是正确的呢?这个就需要浏览器要求web server提供自己的数字证书来证明自己的身份。
网站的身份是什么?域名。你如果打了https://www.zihu.com
,也出现跟知乎一样的网站,浏览器没有警告你说此网站不合法,结果你输入了自己的用户名和密码登录,你觉得这个是什么问题?这就好比你让你的手下把李逵叫过来,结果自己不小心说成了李鬼。你的手下查了查114,真的有个李鬼,手下自然的就把李鬼叫来了,结果这个李鬼和李逵长的还挺类似,然后你自己又不小心对李鬼说了很机密的话被李鬼知道了。整个过程,只能怨你自己不小心了。继续刚才的话题。浏览器要求web server的证书来证明确实是用户在浏览器中输入的网址,并没有连接到错误的网站域名上去,于是web server把自己的数字证书传给浏览器。浏览器对之进行验证,确认此网站的身份。