PKI公钥基础设施通过建设信任根,结合数字证书,实现了可信身份。通过数字证书技术,可以实现数字签名、数据加密。
数字证书的可信
数字证书的可信基于可信根对用户身份的核验,确认信息和用户身份匹配,颁发给用户一个数字凭证,这个数字凭证即为数字证书。
用户基于公钥算法生成公钥和私钥,公钥算法也被称作非对称密钥算法。公钥算法区别于对称密钥算法,加密密钥和解密密钥不是一个,用公钥加密的数据,必须用私钥才能进行解密。并且用私钥加密的数据,用私钥也是不能解密,必须由对应的公钥进行解密。
对应日常信息,如何建立一个可信的凭证?例如银行验证你的信息,要求你出示你的身份证,一代身份证是一个具有防伪技术的物理证件。采用这个方案,我们设计了下面数字证书,
假设当用户去银行办理业务时,向银行出示了这个数字证书,用此证明自己的身份。此时,银行拥有权威机构的公钥(权威机构的公钥是通过线下的方式分发的,这个公钥也可以放在一个可下载的位置,任意读取),此时银行可以对证书内容进行相同的hash运算,将证书中的签名(图中黄底红字部分)用权威机构的公钥解密,对比hash结果和解密结果,如果2者相同,能够证明权威机构认可了数字证书上的内容,银行根据权威机构的认证也接受用户是所持数字证书的身份。
但是,这个过程并不安全,与线下的实物不同,数字证书可以很容易被复制。在上面的方案中,当用户向银行出示自己的数字证书时,银行就会保留一份数字证书。而这份数字证书也可以完全用来证明身份,因此上面的方案是有问题的。
用户也拥有一对密钥,公钥和私钥。私钥由用户保存,公钥放在证书中。银行可以验证证书是经过权威机构签发的,还要经过一次应答/挑战,证明用户拥有证书中公钥对应的私钥。
应答/挑战过程,由银行端发起向用户发送随机数b,用户用私钥加密随机数,银行在用用户证书中的公钥解密加密密文,如果解密结果是随机数b,证明了用户拥有证书对应的私钥。
在上面的方案中,用户向银行证明身份经过了2个步骤,1.提供证书,证书的内容是用户身份信息,证书的可信由权威机构的签名保证。2.用户需要证明拥有证书中对应的私钥。
安全性分析
1.用户是否可以篡改证书?
如果张三将自己证书上的名称改为李四,并向银行提供仿冒证书冒充李四。此时银行通过证书hash值,和证书中的权威机构签名,就可以验证证书经过篡改。
2.用户是否可以截取证书仿冒用户?
张三截获了李四的数字证书,向银行提交李四的数字证书冒充李四。银行会通过应答/挑战验证是否拥有李四的私钥。通常,李四的证书和私钥都是保存在usbkey中的,使用usbkey时还要输入pin码,通过物理ukey+pin码方式保护私钥的安全性。
但如果张三窃取了李四的ukey,并且窥探到李四的pin,就可以冒充李四。当李四发现ukey丢失时,应及时到权威机构对ukey进行注销。
证书分类
以上介绍的是用来做身份认证和数字签名的公钥证书。除了公钥证书之外,也有一些证书文件是不包含公钥信息的。例如属性证书和电子证照。
属性证书,常用来做登录凭证,签发一个文件格式如第一个证书。举一个例子,用户在网站上的"等级"保存在服务端,当多个服务之间跳转,需要一个携带“等级”信息时,可以将信息+服务端签名方式发送给用户,用户在登录其他服务器时出示属性证书证明自己的等级。属性证书用,[name=用户证书名,level=用户级别 ]by服务端数字签名。广泛使用jwt,Json web token中就使用了属性证书的思想。
电子证照,也是一种数字证书,不包含公钥,只包含信息和权威机构的数字签名。例如,电子结婚证可采用[持证人,持证人]by政务部分电子印章签名。当需要出示结婚证时,通过验证签名,可以证明电子证照信息的真实性。